`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')` 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章