`throw 'foo'`、`throw Error('foo')`、`throw new Error('foo')` 有啥区别?

Posted

技术标签:

【中文标题】`throw \'foo\'`、`throw Error(\'foo\')`、`throw new Error(\'foo\')` 有啥区别?【英文标题】:What is the difference between `throw 'foo'`, `throw Error('foo')`, `throw new Error('foo')`?`throw 'foo'`、`throw Error('foo')`、`throw new Error('foo')` 有什么区别? 【发布时间】:2018-02-27 22:30:42 【问题描述】:

我见过 3 种在 javascript 中引发错误的不同方式:

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

它们有什么区别?

注意:我知道类似的问题(1、2、3 等)。它们都没有涵盖所有三种情况。

【问题讨论】:

@RobG 我回答了我自己的问题,因此其他人不必阅读所有其他答案:) 【参考方案1】:

throw 是一个expression,它会停止函数并生成一个exception。任何直接跟在throw 之后的东西都会在异常中传递。把它想象成一个带有语法糖的函数,所以不要写throw('message'),而是写throw 'message'throw new Error('message') 就像 throw 'message' 一样,只是传递的是对象而不是字符串。

throw Error('message')throw new Error('message') 之间的There is no difference:许多核心 JavaScript 对象允许在没有 new 构造函数的情况下创建新对象,而 Error 恰好是其中之一。

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

另请参阅:extremely elaborate illustration。

【讨论】:

请注意,当传递一个 Error 对象时,您可以访问该对象中的 Error.prototype.message 属性。混合两种错误处理实现可能很危险,因为消息可能会丢失(即,您获取 Error.prototype.message 并将其保存到数据库,如果触发了抛出“错误”,您将获得未定义的记录)。

以上是关于`throw 'foo'`、`throw Error('foo')`、`throw new Error('foo')` 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA的throw和throws怎么用!

异常处理中throws和throw的区别?

Java中throws和throw的区别讲解

Java的throw 和throws有啥区别?

Java中throw和throws有啥区别?

在java中throw与throws各自用在啥地方?