JavaScript 全局事件机制如何捕获未处理的 JavaScript 错误

2022-08-29 23:35:50

我想捕获抛出的每个未定义的函数错误。JavaScript 中是否有全局错误处理工具?用例是从未定义的闪存捕获函数调用。


答案 1

如何捕获未处理的 JavaScript 错误

将事件分配给事件处理程序,如下所示:window.onerror

<script type="text/javascript">
window.onerror = function(msg, url, line, col, error) {
   // Note that col & error are new to the HTML 5 spec and may not be 
   // supported in every browser.  It worked for me in Chrome.
   var extra = !col ? '' : '\ncolumn: ' + col;
   extra += !error ? '' : '\nerror: ' + error;

   // You can view the information in an alert to see things working like this:
   alert("Error: " + msg + "\nurl: " + url + "\nline: " + line + extra);

   // TODO: Report this error via ajax so you can keep track
   //       of what pages have JS issues

   var suppressErrorAlert = true;
   // If you return true, then error alerts (like in older versions of 
   // Internet Explorer) will be suppressed.
   return suppressErrorAlert;
};
</script>

如代码中注释的那样,如果 返回值为 ,则浏览器应禁止显示警报对话框。window.onerrortrue

window.onerror 事件何时触发?

简而言之,当任一 1 时,将引发该事件。有一个未捕获的异常或 2。)发生编译时错误。

未捕获的异常

  • 抛出“一些消息”
  • call_something_undefined();
  • cross_origin_iframe.contentWindow.document;,一个安全异常

编译错误

  • <script>{</script>
  • <script>for(;)</script>
  • <script>"oops</script>
  • setTimeout("{", 10);,它将尝试将第一个参数编译为脚本

支持 window.onerror 的浏览器

  • 铬 13+
  • 火狐 6.0+
  • 互联网浏览器 5.5+
  • 歌剧 11.60+
  • 野生动物园 5.1+

截图:

将它添加到测试页面后,上面的 onerror 代码在操作中的示例:

<script type="text/javascript">
call_something_undefined();
</script>

Javascript alert showing error information detailed by the window.onerror event

AJAX 错误报告示例

var error_data = {
    url: document.location.href,
};

if(error != null) {
    error_data['name'] = error.name; // e.g. ReferenceError
    error_data['message'] = error.line;
    error_data['stack'] = error.stack;
} else {
    error_data['msg'] = msg;
    error_data['filename'] = filename;
    error_data['line'] = line;
    error_data['col'] = col;
}

var xhr = new XMLHttpRequest();

xhr.open('POST', '/ajax/log_javascript_error');
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onload = function() {
    if (xhr.status === 200) {
        console.log('JS error logged');
    } else if (xhr.status !== 200) {
        console.error('Failed to log JS error.');
        console.error(xhr);
        console.error(xhr.status);
        console.error(xhr.responseText);
    }
};
xhr.send(JSON.stringify(error_data));

JSFiddle:

https://jsfiddle.net/nzfvm44d/

引用:


答案 2

这是否可以帮助您:

<script type="text/javascript">
window.onerror = function() {
    alert("Error caught");
};

xxx();
</script>

我不确定它如何处理Flash错误...

更新:它在Opera中不起作用,但我现在正在破解Dragonfly,看看它得到了什么。关于黑客攻击蜻蜓的建议来自这个问题:

模仿窗口。onerror in Opera using javascript