使用 window.onerror 和 try-catch 块处理错误之间的差异

Differences between handling errors with window.onerror and try-catch block

本文关键字:之间 错误 处理 window onerror try-catch 使用      更新时间:2023-09-26

我正在考虑使用 window.onerror 与 JavaScript 运行时错误来处理 JavaScript 运行时错误。 try{...} catch(e){...}块。

https://developer.mozilla.org/en-US/docs/Web/API/GlobalEventHandlers.onerror 指出:

请注意,某些/许多错误事件不会触发 window.onerror,您必须专门侦听它们。

似乎window.onerrortry{...} catch(e){...}都可以处理引用错误:http://jsfiddle.net/7RARf/

此外,两者都无法处理语法错误:http://jsfiddle.net/UXVs2/

除了使用 window.onerror 处理错误和try{...} catch(e){...} like 处理错误之间的明显区别外,try-catch 允许我们优雅地处理错误,重新抛出它们等,而 window.onerror 函数则不然,等等。是否有任何错误可以用window.onerror处理,但不能用try{...} catch(e){...}处理?反之亦然?

是 - window.onerror

可以检测由浏览器工作流程引起的错误 - try/catch 仅在执行的 js 代码的有限部分上运行。 window.onerror 可能会检测插件问题或由不严格意义上的代码引起的任何错误(像 jQ 这样的库,像 YT API 等的 API( - 例如:你不能把外部库支持的异步代码放在try中(不修改外文代码(, 您不能将 HTML 标签完成的脚本加载放入 try(它由浏览器管理( - 当脚本文件损坏并且无法加载到标签时,window.onerror 将触发 - window.onerror 抛出的错误比 catch 能够支持的错误多得多 - 它还包含有关文件和行的信息。缺点是window.onerror只提供信息 - 代码被中断,使用try/catch你可以提供回退行为并允许代码处理情况 - 即使有错误

您可以使用 try/catch 来捕获语法错误,但前提是您正在计算代码表单字符串:

try{
  eval('(function(){asdhaowd;;;;asd;!!!@#!@$lolzolololol]]]]]]]})()');
} catch(e){
  do sth();
}

它会捕获评估错误(意外的"]"或之前的内容(我在我的网站上使用它来检测用户上传的损坏代码。window.onerror 仅用于调试 - 它不能防止代码崩溃,当尝试可以

window.onerror 就像一个全局的 try/catch 块。 使用 try/catch 来定位您知道可能会出错的特定块。

window.onerror 是一般情况。 我注意到的一件事是,您分配给window.onerror以处理错误的函数应该在调用它的代码之上定义,否则您可能会遇到未定义的函数错误。