记 Angular1 对 JavaScript 运行时错误的处理
正文
在 Angular1 中,uncaught exceptions
会被在 $exceptionHandler service
集中处理,并通过 console.error()
将报错信息输出。
// https://github.com/angular/angular.js/blob/master/src/ng/rootScope.js
$apply: function(expr) {
try {
beginPhase('$apply');
try {
return this.$eval(expr);
} finally {
clearPhase();
}
} catch (e) {
$exceptionHandler(e);
} finally {
try {
$rootScope.$digest();
} catch (e) {
$exceptionHandler(e);
throw e;
}
}
},
这意味着,Angular1 中的运行时错误,将不会被 window.onerror
捕获。
好在可以改写 $exceptionHandler service
,使其可以被 window.onerror
捕获。
// https://rollbar.com/blog/client-side-angular-error-handling/
angular.module('exceptionOverride', []).factory('$exceptionHandler',
function() {
return function(exception, cause) {
exception.message += 'Angular Exception: "' + cause + '"';
throw exception;
};
}
);
然后这样使用:
var myModule = angular.module('myApp', ['exceptionOverride'])
题外话
最近成功搭建了一套“前端异常监控系统”。
这套系统是根据这篇文章 前端异常监控系统的落地 及其 源代码 搭建的。
感谢他们对开源社区的贡献。