我正在尝试向我的网站添加 onerror 事件。
window.onerror = function() {
alert("an error");
}
但我收到的只是:
notThere();
ReferenceError: notThere is not defined
我错过了什么?
浏览器:Chrome 26.0.1410.64 m
重现步骤:
控制台直接产生错误时,不会触发window.onerror。 不过,它可以通过
setTimeout
触发,例如,setTimeout(function() { notThere(); }, 0);
window.onerror
在Chrome中工作(参见jsfiddle - http://jsfiddle.net/PWSDF/),但显然不在控制台中 - 这有一定道理。
您可能无法处理
window.onerror
中的错误的一些其他原因(除了提到的):
window.onerror
。如果您使用 Angular,错误将不会通过
window.onerror
。你必须使用这个工厂来处理它们:
.factory('$exceptionHandler', function() {
return function errorCatcherHandler(exception, cause) {
console.error(exception);
if (window.OnClientError) window.OnClientError(exception);
};
})
参见:
https://docs.angularjs.org/api/ng/service/$exceptionHandler
http://bahmutov.calepin.co/catch-all-errors-in-angular-app.html
对我来说,问题是错误是在异步函数中抛出的,而异步函数中抛出的错误是由
window.onunhandledrejection
处理的,而不是 window.onerror
(来源:为什么 onerror 不拦截来自 Promise 和异步函数的异常) 。因此,如果您希望错误处理程序能够处理来自异步函数的错误,则还需要将其分配给 window.onunhandledrejection
:
window.onerror = window.onunhandledrejection = function(){
alert("an error");
}
async function f(){
notThere();
}
f(); //Alerts "an error"