2017-08-03 43 views
0

我创建了一个小的AngularJS应用程序,如果特定行未注释,可能会导致某些错误。在应用程序的HTML中,我创建了一个内联<script>,用于侦听window对象的错误事件。AngularJS吞咽某些错误,防止窗口的错误事件被调用

<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

一些试验后,它将显示的错误存在的内部服务或控制器委派到他们被发现和记录,防止它们传播到window对象AngularJS $exceptionHandler ..如果我将覆盖服务(见例子) ,我现在可以拦截这些错误并将它们记录下来或重新抛出,以便它们传播到windowerror事件。

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

的文档不明确这一点,(这是什么一个AngularJS表达式?是一个运行/配置块不是一个?)

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

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