由于我们可以用throwJavascript中的关键字抛出任何内容,因此我们不能直接抛出错误消息字符串吗?
有人知道有什么收获吗?
让我为此添加一些背景:在JavaScript世界中,人们通常依赖于参数检查,而不是使用try-catch机制,因此仅使用抛出致命错误是有意义的throw。不过,为了能够捕获某些系统错误,我必须对自己的错误使用其他类,并且我不应该创建Error的子类,而应该使用String。
由于我们可以用throwJavascript中的关键字抛出任何内容,因此我们不能直接抛出错误消息字符串吗?
有人知道有什么收获吗?
让我为此添加一些背景:在JavaScript世界中,人们通常依赖于参数检查,而不是使用try-catch机制,因此仅使用抛出致命错误是有意义的throw。不过,为了能够捕获某些系统错误,我必须对自己的错误使用其他类,并且我不应该创建Error的子类,而应该使用String。
Answers:
可以随意抛出任何内容,但是请记住,如果捕获在您自己的代码之外,则可能期望使用完整的Error实例而不是纯字符串。
.message属性Error是字符串,尝试在其上调用字符串方法,然后爆炸。
a @ main.js:4 (anonymous) @ main.js:7
.stack对某些自动错误处理有用的属性(例如,在向服务器设置错误的自动报告以调试在生产中出现问题的错误时),但这更多的是边缘情况;如果您抛出字符串,则在浏览器中进行日常手动调试会很好。
您知道,您可以在消息中抛出错误。
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使用自定义消息来抛出对象。它为您省去了检查错误类型以将其他本地生成的错误告诉“您的”错误的麻烦...当然,除非您是故意这样做的(然后可能将Error对象重新抛出catch作用域) 。
就像上面其他人提到的那样,如果您没有抛出Error对象,那么您必须具有try / catch块来捕获这些对象并适当地处理它们,否则会给调试带来很大的麻烦。
但是,当出于非错误处理目的(例如控制程序流)抛出错误时,这可能是throw无错误利用的有用方法。
当使用抛出来控制程序流时,它在任何语言中都可能效率低下,因为运行时通常会花很多时间来释放调用堆栈信息并序列化数据,以便其可用于用户范围。通过避免错误创建,可以避免这种性能下降。关键是您必须在调用堆栈上拥有一个知道如何处理这种情况的处理程序。例如,如果您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
}
}