【问题标题】:AngularJS swallowing certain errors, preventing window's error event from being calledAngularJS 吞下某些错误,防止调用窗口的错误事件
【发布时间】:2017-08-03 16:29:22
【问题描述】:

我创建了一个小型 AngularJS 应用程序,如果未注释特定行,它可能会导致某些错误。在应用程序的 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 上引发事件?

【问题讨论】:

    标签: javascript angularjs error-handling


    【解决方案1】:

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

    angular.module('app').service('$exceptionHandler', function () {
        return function (error, cause) {
            console.log('ERROR caught by exception handler: ', error, cause)
        }
    })
    

    文档对此并不清楚(什么是 AngularJS 表达式?不是运行/配置块吗?)

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

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

    【讨论】:

      猜你喜欢
      • 2017-05-24
      • 2013-06-07
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 2021-08-03
      • 2017-11-28
      • 1970-01-01
      相关资源
      最近更新 更多