`throw 'foo'`、`throw Error('foo')`、`throw new Error('foo')` 之间有什么区别?
What is the difference between `throw 'foo'`, `throw Error('foo')`, `throw new Error('foo')`?
我在 JavaScript 中看到了 3 种不同的抛出错误的方法:
throw 'message';
throw Error('message');
throw new Error('message');
它们有什么区别?
注意:我知道类似的问题(1,2,3,等等)。 None 涵盖所有三种情况。
throw
是一个 expression which halts the function and generates an exception。 throw
之后的任何内容都会在异常中传递。把它想象成一个带有语法糖的函数,所以不用写 throw('message')
,而是写 throw 'message'
。 throw new Error('message')
就像 throw 'message'
一样,只是传递的是对象而不是字符串文字。
There is no difference 在 throw Error('message')
和 throw new Error('message')
之间:许多核心 JavaScript 对象允许在没有 new
构造函数的情况下创建新对象,并且Error
恰好是其中之一。
也就是说,您应该始终使用 throw new Error('message')
。 Error
对象包含堆栈跟踪和其他有用的调试信息,这些信息在您使用字符串文字时会丢失。使用 ES6 classes 创建对象需要使用 new
,而 extending Error
via a class 是保留堆栈跟踪的唯一方法。创建自定义错误 class 使错误处理更加统一。
我在 JavaScript 中看到了 3 种不同的抛出错误的方法:
throw 'message';
throw Error('message');
throw new Error('message');
它们有什么区别?
注意:我知道类似的问题(1,2,3,等等)。 None 涵盖所有三种情况。
throw
是一个 expression which halts the function and generates an exception。 throw
之后的任何内容都会在异常中传递。把它想象成一个带有语法糖的函数,所以不用写 throw('message')
,而是写 throw 'message'
。 throw new Error('message')
就像 throw 'message'
一样,只是传递的是对象而不是字符串文字。
There is no difference 在 throw Error('message')
和 throw new Error('message')
之间:许多核心 JavaScript 对象允许在没有 new
构造函数的情况下创建新对象,并且Error
恰好是其中之一。
也就是说,您应该始终使用 throw new Error('message')
。 Error
对象包含堆栈跟踪和其他有用的调试信息,这些信息在您使用字符串文字时会丢失。使用 ES6 classes 创建对象需要使用 new
,而 extending Error
via a class 是保留堆栈跟踪的唯一方法。创建自定义错误 class 使错误处理更加统一。