既然我们可以throw在Javascript中使用关键字抛出任何内容,那么我们不能直接抛出错误消息字符串吗?
有谁知道这有什么捕获?
让我为此添加一些背景:很多时候,在JavaScript世界中,人们依赖于参数检查而不是使用try-catch机制,所以只抛出致命错误才有意义throw.仍然,为了能够捕获一些系统错误,我必须为我自己的错误使用不同的类,而不是创建Error的子类,我想我应该只使用String.
lan*_*nzz 44
抛出你喜欢的东西是可以的,但请记住,如果catch不在你自己的代码之外,那么它可能需要一个完整的Error实例而不是一个普通的字符串.
Ber*_*rgi 38
有谁知道这有什么捕获?
字符串不是错误对象,并且不传达任何有用的调试信息.Devtools依赖于此,例如创建错误的文件和行,throw位置处的堆栈跟踪等,它们可用作Error对象的属性.
每当你想到抛出一个原始字符串值时,抛出一个new Error("<the string>")代替.
Max*_*Art 16
你知道,你可以在邮件中抛出错误.
try {
throw new Error("This is an error");
} catch (e) {
alert(e.message); // This is an error
}
Run Code Online (Sandbox Code Playgroud)
但你实际上可以抛出字符串:
try {
throw "This is an error";
} catch (e) {
alert(e); // This is an error
}
Run Code Online (Sandbox Code Playgroud)
正如其他人在上面提到的,如果你没有抛出一个 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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20832 次 |
| 最近记录: |