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


当前回答

复杂的错误处理

如果你的错误处理非常复杂,因此可能会抛出一个错误本身,添加一个标志来表明你是否已经在“errorHandling-Mode”是很有用的。像这样:

var appIsHandlingError = false;

window.onerror = function() {
    if (!appIsHandlingError) {
        appIsHandlingError = true;
        handleError();
    }
};

function handleError() {
    // graceful error handling
    // if successful: appIsHandlingError = false;
}

否则你会发现自己陷入了一个无限循环。

其他回答

我建议你试试Trackjs。

它将错误日志记录作为一种服务。

设置起来非常简单。只需要在每页中添加一行<script>就可以了。这也意味着如果你决定不喜欢它,它将非常简单地删除。

还有其他服务,如Sentry(如果你可以托管自己的服务器,它是开源的),但它不能做Trackjs所做的事情。Trackjs记录用户在浏览器和web服务器之间的交互,这样你就可以实际跟踪导致错误的用户步骤,而不仅仅是文件和行号引用(可能还有堆栈跟踪)。

这对你有帮助吗:

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

xxx();
</script>

我不确定它是如何处理Flash错误的…

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

模拟窗口。onerror在Opera使用javascript

你可以通过给window.onerror赋值函数来监听onerror事件:

 window.onerror = function (msg, url, lineNo, columnNo, error) {
        var string = msg.toLowerCase();
        var substring = "script error";
        if (string.indexOf(substring) > -1){
            alert('Script Error: See Browser Console for Detail');
        } else {
            alert(msg, url, lineNo, columnNo, error);
        }   
      return false; 
  };

复杂的错误处理

如果你的错误处理非常复杂,因此可能会抛出一个错误本身,添加一个标志来表明你是否已经在“errorHandling-Mode”是很有用的。像这样:

var appIsHandlingError = false;

window.onerror = function() {
    if (!appIsHandlingError) {
        appIsHandlingError = true;
        handleError();
    }
};

function handleError() {
    // graceful error handling
    // if successful: appIsHandlingError = false;
}

否则你会发现自己陷入了一个无限循环。

如何捕捉未处理的Javascript错误

分配窗口。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的值。如果Onerror为真,则浏览器应该抑制显示警报对话框。

窗户什么时候开。onerror事件火灾?

简而言之,当1.)存在未捕获的异常或2.)发生编译时错误时引发该事件。

未捕获异常 抛出“一些信息” call_something_undefined (); ,一个安全异常 编译错误 <脚本>{> < /脚本 < >脚本(,)> < /脚本 < >脚本”哦> < /脚本 setTimeout("{", 10);,它将尝试将第一个参数编译为 一个脚本

浏览器支持window.onerror

铬13 + Firefox 6.0 + Internet Explorer 5.5+ Opera 11.60 + Safari 5.1 +

截图:

上面的onerror代码在添加到测试页面后起作用的例子:

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

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/

引用:

Mozilla开发者网络::window.onerror 处理和避免网页错误第2部分:运行时错误 返回基础- JavaScript onerror事件 window.onerror可以更好地处理错误 Window onError事件 使用onerror事件来抑制JavaScript错误 SO:: window。在Firefox中未启动onerror