我创建了一个小的AngularJS应用程序,如果特定行未被注释,可能会导致某些错误。在applciation的HTML中,我创建了一个内联<script>
来监听window
对象的错误事件。
<script>
window.addEventListener('error', function (error) {
console.log('====== An error occured', error);
})
</script>
在下面的代码中,我希望为所有7个错误调用事件监听器(当我取消注释每个错误并运行程序时)。但是,服务(#7)和控制器(#3)内部手动引发的错误不会触发事件侦听器。它们会向控制台输出错误消息。
// ERROR 1:
// throw new Error('manually thrown error ouside of AngularJs');
// ERROR 2 (syntax error):
// varasakfsdjklajskdfasdf var adfasdf a var adasdf
class MyController {
constructor(MyService) {
MyService.doSomething()
// ERROR 3:
// throw new Error('manually thrown error inside of AngularJs');
// ERROR 4:
// varasakfsdjklajskdfasdf var adfasdf a var adasdf
}
}
function configBlock() {
// ERROR 5:
// throw new Error('manually thrown error inside of AngularJs');
}
function runBlock() {
// ERROR 6:
// throw new Error('manually thrown error inside of AngularJs');
}
class MyService {
doSomething() {
// Error 7
// throw new Error('manually thrown error inside of AngularJs');
}
}
angular.module('app', []);
angular.module('app').controller('MyController', MyController);
angular.module('app').config(configBlock);
angular.module('app').run(runBlock);
angular.module('app').service('MyService', MyService);
这里发生了什么,以及如何可靠地获取每个错误以引发window object
上的事件?
答案 0 :(得分:0)
经过一些实验,似乎服务或控制器内部发生的错误被委托给AngularJS $exceptionHandler
,在那里捕获并记录它们,防止它们传播到window
对象。如果我覆盖该服务(参见示例),我现在可以拦截这些错误并记录它们或重新抛出它们,以便它们传播到window
的{{1}}事件。
error
这方面的文档不清楚(什么是AngularJS表达式?是一个运行/配置块而不是一个?)
AngularJS表达式中任何未捕获的异常都委托给它 服务。默认实现只是委托给$ log.error 将其记录到浏览器控制台中。