AngularJS吞下某些错误,阻止调用窗口的错误事件

时间:2017-08-03 16:29:22

标签: javascript angularjs error-handling

我创建了一个小的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上的事件?

1 个答案:

答案 0 :(得分:0)

经过一些实验,似乎服务或控制器内部发生的错误被委托给AngularJS $exceptionHandler,在那里捕获并记录它们,防止它们传播到window对象。如果我覆盖该服务(参见示例),我现在可以拦截这些错误并记录它们或重新抛出它们,以便它们传播到window的{​​{1}}事件。

error

这方面的文档不清楚(什么是AngularJS表达式?是一个运行/配置块而不是一个?)

  

AngularJS表达式中任何未捕获的异常都委托给它   服务。默认实现只是委托给$ log.error   将其记录到浏览器控制台中。

https://docs.angularjs.org/api/ng/service/$exceptionHandler