【问题标题】:Do uncatchable exceptions exist in Javascript?Javascript 中是否存在无法捕获的异常?
【发布时间】:2015-02-06 18:00:04
【问题描述】:

是否有任何 javascript 运行时(浏览器、Node 等)曾经抛出无法捕获的异常?在 javascript 环境中遇到的任何和所有异常都可以在 try/catch 语句中捕获吗?

【问题讨论】:

  • Sharing your research helps everyone。告诉我们您尝试了什么以及为什么它不能满足您的需求。这表明您已经花时间尝试帮助自己,它使我们免于重复明显的答案,最重要的是它可以帮助您获得更具体和相关的答案。另见How to Ask
  • 异步回调的异常很难(但并非不可能)捕获。基本上它取决于提供异步功能的环境。
  • 这个问题属于programmers.se吗?
  • 存在无法捕获的静默安全错误,因为捕获它们会泄露有关系统硬件的信息。很难争论这些是否真的是 Javascript 错误。

标签: javascript exception exception-handling


【解决方案1】:

如果 exceptions 是指任何破坏脚本的异常情况,那么它们都可能引发无法捕获的异常,因为大多数语法错误是无法捕获的。只能捕获来自动态评估代码(evalnew Function)的语法错误。

try { :( } catch(e) { } // uncatchable syntax error

假设您的意思是使用try..catch 可捕获。从技术上讲,您可以使用error 事件来捕获来自其他脚本块的语法错误:

<script> onerror = function (e) { return true; }; </script>
<script> :( </script>

另一方面,也许您不会将评估之前发生的错误视为异常。在这种情况下,“无法捕获的异常”可能会归类为从其他执行上下文(例如使用 setTimeout 调用的函数)引发的异常,在这种情况下,您无法控制引发异常的执行上下文。当然,这些异常不会中断您的程序流程。

【讨论】:

  • 好答案。我只想指出,无法捕获的错误类别在 ECMAScript 5 规范中称为“early errors”。早期错误是语法错误的超集(因为它们还包括一些与语法无关的非法声明)。
  • @apsillers 好点。 IIRC 在 Chrome 和 Moz 中列出的所有内容都归结为 SyntaxError,除了 PutValue 是 ReferenceError。
  • 但这些并不是真正的例外,不是吗?
  • @JuanMendes 好问题。该规范从未定义“异常”,但在处理评估期间发生的事情时使用“抛出 SyntaxError 异常”之类的语言和处理评估前发生的事情时使用“is a SyntaxError”之类的语言似乎非常一致。如果它在评估之前发生,则认为它不是例外是有道理的,但我不确定这就是 OP 的想法。
  • @Hey:你会想要阅读algorithm conventions 的最后一段 :-)
【解决方案2】:

概括另一个答案 - 如果没有专门设计用于处理它们的“bug guns”,异步异常通常是不可能处理的 - 即域和节点中的进程"uncaughtException" 事件和浏览器中的onerror .

获得此类错误的最简单方法是:

setTimeout(function(){
    throw "Catch me if you can!";
});

这就是您在另一个答案示例中的http.get({host:host, port:80}, console.error); 中看到的内容。

【讨论】:

  • 我认为 http.get 的异常还有更多的原因。我可以用 onerror 捕获从 setTimeout 抛出的异常,但不是 http.get 抛出的异常(虽然它是以异步方式抛出的,但在调用 http.get 后继续处理)。
  • @Hey 那是因为onerror 是一个浏览器工具,等效的节点是使用process.on("uncaughtException", function(e){ ...
  • 糟糕,我的意思是节点的 uncaughtException。不过,我刚刚意识到 node 并没有用 uncaughtException 捕获 anything 。也许该功能被废弃?我猜在单独的执行上下文中抛出的错误是否可以捕获取决于您是否愿意修改其他人的代码(或使用像 onerror/uncaughtException 这样的废话)。
  • 给我看你的代码 - uncaughtException 在节点中工作得很好。
  • process.on("uncaughtException", function(e){ console.log('hi') }); throw 'woo'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-26
  • 2011-12-17
  • 2010-10-29
  • 1970-01-01
  • 2021-08-07
  • 2021-10-14
相关资源
最近更新 更多