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

时间:2013-10-02 15:49:50

标签: javascript

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

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

  

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

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

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

除了使用window.onerror处理错误和使用like try{...} catch(e){...}处理它们之间的明显区别之外,try-catch允许我们优雅地处理错误,重新抛出错误等等。而window.onerror功能没有,等两种处理错误的方式之间存在哪些其他差异?是否有window.onerrortry{...} catch(e){...}无法处理的错误?反之亦然?

2 个答案:

答案 0 :(得分:1)

是 - 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();
}

它会捕获eval错误(意外'''或之前的某些内容) 我在我的网站上使用它来检测用户上传的损坏代码。 window.onerror仅对调试有用 - 它不能阻止代码崩溃,当尝试可以

答案 1 :(得分:0)

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

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