2013-10-02 44 views
3

我正在考虑处理JavaScript运行时错误与window.onerrortry{...} catch(e){...}块。处理与window.onerror和try-catch块的错误之间的差异

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

Note that some/many error events do not trigger window.onerror, you have to listen for them specifically.

似乎都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.onerror处理的错误,但是try{...} catch(e){...}不能处理?反之亦然?

回答

1

是的 - window.onerror可以检测由浏览器工作流程造成的错误 - try/catch只在有限的部分执行js代码。 window.onerror可能会检测到插件问题或由于不严格代码而导致的任何错误(像jQ,API等YT API等库) - 例如:您不能将外部库支持的异步代码尝试(无需修改外部代码) ,你不能把脚本加载完成的HTML标签尝试(它由浏览器管理) - window.onerror将触发时,脚本文件被损坏,无法加载标签 - window.onerror引发更多的错误比catch能够支持 - 也包含有关文件和行的信息。缺点是window.onerror只给出了信息 - 代码被中断,使用try/catch语句可以提供备用行为,并允许代码来处理情况 - 即使有错误

你可以使用try/catch语句捕捉语法错误但只有当你正在评估代码形式的字符串:

try{ 
    eval('(function(){asdhaowd;;;;asd;[email protected]#[email protected]$lolzolololol]]]]]]]})()'); 
} catch(e){ 
    do sth(); 
} 

它会赶上的eval错误(意外“]”或之前的东西) 我用它在我的网站上检测由用户上传的受损代码。 window.onerror仅适用于调试 - 它不能防止代码崩溃,当尝试可以

+0

如果您尝试 - 你可能会期望发生错误 - window.onerror是有用的跟踪代码中的意外错误 - 例如。您可以将函数发送错误报告绑定到您的邮件 – Lapsio