抛出非错误对象的用例是什么?

bon*_*ull 7 javascript error-handling exception-handling

在 JS 中你可以throw new Error()throw 'foo'甚至throw null.

为什么要抛出非Error实例?我不是指继承自的对象Error——我指的是其他随机对象或基元。

Rob*_*vey 2

throw只是抛出一个任意表达式。它不以任何方式连接到Error对象;你可以throw任何表达。

但从 Error 对象继承可能是一个更好的主意,这正是其他标准内置错误所做的:

EvalError
创建一个实例,表示有关全局函数 eval() 发生的错误。

InternalError 创建一个表示 JavaScript 引擎中抛出内部错误时发生的错误的实例。例如“太多递归”。

RangeError
创建一个实例,表示当数值变量或参数超出其有效范围时发生的错误。

ReferenceError
创建一个表示取消引用无效引用时发生的错误的实例。

SyntaxError
创建一个实例,表示在 eval() 中解析代码时发生的语法错误。

TypeError
创建一个实例,表示当变量或参数的类型无效时发生的错误。

URIError
创建一个实例,表示当向encodeURI() 或decodeURI() 传递无效参数时发生的错误。

所有这些对象原型上都继承自 Error 对象,因此虽然抛出任何任意对象都是合法的,但抛出 Error 对象或继承自 Error 的对象可能更有意义,就像 Javascript 本身一样。

此 MDN 页面上有几个正确方法的示例。

  • 这并没有回答我的问题,我的问题基本上是“为什么要抛出一个字符串或‘null’?” 潜台词是,原语(或其他非“Error”对象)在抛出时不提供堆栈跟踪之类的东西。 (10认同)
  • @boneskull 如果有人不想/不需要堆栈跟踪怎么办?捕获堆栈跟踪的成本相对较高。 (2认同)
  • @boneskill:如果你想马虎的话,基本上你会抛出一个字符串或一个空值。 (2认同)