既然我们可以用throw
Javascript 中的关键字抛出任何东西,那么我们不能直接抛出一个错误消息字符串吗?
有谁知道这有什么问题?
让我补充一些背景知识:在 JavaScript 世界中,人们经常依赖参数检查而不是使用 try-catch 机制,因此只使用throw
. 尽管如此,为了能够捕获一些系统错误,我必须为自己的错误使用不同的类,而不是创建错误的子类,我认为我应该只使用字符串。
既然我们可以用throw
Javascript 中的关键字抛出任何东西,那么我们不能直接抛出一个错误消息字符串吗?
有谁知道这有什么问题?
让我补充一些背景知识:在 JavaScript 世界中,人们经常依赖参数检查而不是使用 try-catch 机制,因此只使用throw
. 尽管如此,为了能够捕获一些系统错误,我必须为自己的错误使用不同的类,而不是创建错误的子类,我认为我应该只使用字符串。
虽然可以抛出任何值,但通常认为抛出除了实例Error
或其子类之一之外的任何东西都是糟糕的形式。有几个原因:
message
、stacktrace
和属性。name
Error
你可以用消息抛出错误,你知道的。
try {
throw new Error("This is an error");
} catch (e) {
alert(e.message); // This is an error
}
但你实际上可以抛出字符串:
try {
throw "This is an error";
} catch (e) {
alert(e); // This is an error
}
正如其他人在上面提到的那样,如果您没有抛出 Error 对象,那么您必须有 try/catch 块来捕获这些对象并适当地处理它们,否则会在调试时受到伤害。
然而,当涉及到为了控制程序流等非错误处理目的而抛出错误时,这可能是一种在throw
没有错误的情况下使用的有用方法。
当使用 throws 来控制程序流时,它在任何语言中都可能是低效的,因为运行时通常会做很多繁重的工作来展开调用堆栈信息并序列化数据,以便它在用户范围内可用。通过避免创建错误,您可以避免这种性能损失。关键是您必须在调用堆栈中有一个处理程序,该处理程序知道如何处理这种情况。例如,如果您throw {isHardStop: true, stopCode: SOME_CODE}
设计处理程序来检测这一点,您可能能够扁平化您的一些代码或选择更简洁的语法。
这个梯子案例的处理程序的结构可能如下:
try { ... } catch(thr) {
if(!thr){
// Is not Error or Json - Handle accordingly
} else if(thr.isHardStop){
// Handle the stop
} else {
// Most likely a real error. Handle accordingly
}
}