2017-08-03 50 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的