\`throw new Error\` 和 \`throw someObject\` 有什么区别?

新手上路,请多包涵

我想编写一个通用错误处理程序,它将捕获在任何代码实例中故意抛出的自定义错误。

当我在下面的代码中 throw new Error('sample')

try {
    throw new Error({'hehe':'haha'});
    // throw new Error('hehe');
} catch(e) {
    alert(e);
    console.log(e);
}

日志在 Firefox 中显示为 Error: [object Object] ,我无法解析该对象。

对于第二次 throw ,日志显示为: Error: hehe

而当我这样做的时候

try {
    throw ({'hehe':'haha'});
} catch(e) {
    alert(e);
    console.log(e);
}

控制台显示为: Object { hehe="haha"} 我可以在其中访问错误属性。

有什么区别?

是代码中看到的差异吗?像字符串一样将作为字符串和对象作为对象传递,但语法会有所不同吗?

我还没有探索过抛出错误对象……我只做了抛出字符串。

除了上面提到的两种方法,还有其他方法吗?

原文由 Jayapal Chandran 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

javascript中’throw new Error’和’throw someObject’之间的区别在于throw new Error以以下格式包装传递给它的错误 -

{ 名称:’错误’,消息:’您在构造函数中传递的字符串’

}

throw someObject 将按原样抛出对象,并且不允许从 try 块执行任何进一步的代码,即与 throw new Error 相同。

这是关于 The Error 对象和抛出你自己的错误的 一个很好的解释

错误对象

如果发生错误,我们可以从中提取什么?所有浏览器中的 Error 对象都支持以下两个属性:

  • name:错误的名称,或者更具体地说,错误所属的构造函数的名称。

  • message:错误的描述,此描述因浏览器而异。

name 属性可以返回六个可能的值,如前所述,它们对应于错误构造函数的名称。他们是:

 Error Name Description

 EvalError An error in the eval() function has occurred.

 RangeError Out of range number value has occurred.

 ReferenceError An illegal reference has occurred.

 SyntaxError A syntax error within code inside the eval() function has occurred.
 All other syntax errors are not caught by try/catch/finally, and will
 trigger the default browser error message associated with the error.
 To catch actual syntax errors, you may use the onerror event.

 TypeError An error in the expected variable type has occurred.

 URIError An error when encoding or decoding the URI has occurred
 (ie: when calling encodeURI()).

抛出你自己的错误(例外)

在控制自动从 try 块转移到 catch 块之前,无需等待 6 种类型的错误之一发生,您还可以显式抛出您自己的异常以强制其按需发生。这对于创建自己的错误定义以及何时应将控制权转移到 catch 非常有用。

原文由 Hemant Metalia 发布,翻译遵循 CC BY-SA 4.0 许可协议

扔“我是邪恶的”

throw终止 进一步执行并在 捕获 错误时公开消息字符串。

 try {
  throw "I'm Evil"
  console.log("You'll never reach to me", 123465)
} catch (e) {
  console.log(e); // I'm Evil
}

投掷 后的控制台将永远不会到达终止原因。


抛出新的错误(“我是邪恶的”)

throw new Error 公开一个带有两个参数 namemessage 的错误事件。它还终止进一步执行

 try {
  throw new Error("I'm Evil")
  console.log("You'll never reach to me", 123465)
} catch (e) {
  console.log(e.name, e.message); // Error I'm Evil
}

抛出错误(“我是邪恶的”)

只是为了完整起见,这也有效,尽管从技术上讲这不是正确的方法 -

 try {
  throw Error("I'm Evil")
  console.log("You'll never reach to me", 123465)
} catch (e) {
  console.log(e.name, e.message); // Error I'm Evil
}

console.log(typeof(new Error("hello"))) // object
console.log(typeof(Error)) // function

原文由 Nishchit 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题