`throw 'foo'`、`throw Error('foo')`和`throw new Error('foo')`之间有什么区别?

10

我见过JavaScript中三种不同的抛出错误的方法:

throw 'message';
throw Error('message');
throw new Error('message');

什么是它们之间的区别?
注意:我知道有类似的问题(123等)。但它们都没有涵盖所有三种情况。

@RobG 我回答了自己的问题,这样其他人就不必阅读所有其他答案 :) - Indolering
1个回答

15

throw是一个表达式,它会停止函数的执行并生成一个异常。紧跟在throw后面的内容将被传递到异常中。可以将其视为具有语法糖的函数,所以不需要写成throw('message'),而是写成throw 'message'throw new Error('message')throw 'message'相同,只是传递的是一个对象而不是字符串字面量。

throw Error('message')throw new Error('message')之间没有区别:许多核心JavaScript对象允许创建一个新对象而无需使用new构造函数,Error恰好是其中之一。

话虽如此,您应该始终使用throw new Error('message')Error对象包含堆栈跟踪和其他有用的调试信息,这些信息在使用字符串字面量时会丢失。使用ES6类创建对象需要使用new,通过类扩展Error是保留堆栈跟踪的唯一方法。创建自定义错误类可以使错误处理更加统一。

参见:详细说明的插图


请注意,当传递一个 Error 对象时,您可以在对象中访问 Error.prototype.message 属性。将错误处理实现混合使用可能会很危险,因为消息可能会丢失(例如,如果获取 Error.prototype.message 并将其保存到数据库中,则如果触发 throw "error",则会得到未定义的记录)。 - Santiago

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接