既然我们可以throw
在Javascript中用关键字抛出任何东西,那么我们不能直接抛出一个错误消息字符串吗?
有谁知道这有什么问题吗?
让我为此添加一些背景知识:在 JavaScript 世界中,人们通常依赖参数检查而不是使用 try-catch 机制,因此仅使用throw
. 尽管如此,为了能够捕获一些系统错误,我必须为自己的错误使用不同的类,而不是创建 Error 的子类,我认为我应该只使用 String。
既然我们可以throw
在Javascript中用关键字抛出任何东西,那么我们不能直接抛出一个错误消息字符串吗?
有谁知道这有什么问题吗?
让我为此添加一些背景知识:在 JavaScript 世界中,人们通常依赖参数检查而不是使用 try-catch 机制,因此仅使用throw
. 尽管如此,为了能够捕获一些系统错误,我必须为自己的错误使用不同的类,而不是创建 Error 的子类,我认为我应该只使用 String。
虽然是好的可能引发任意值,它通常被认为是拙劣的形式抛出比的实例之外的任何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
}
}