[英]Angular: Can I ensure that my logging module gets configured before $exceptionHandler under normal circumstances?
我正在編寫一個錯誤記錄模塊,以將Raygun記錄添加到AngularJS應用程序。 標准方法是為$exceptionHandler
注冊一個裝飾器,如下所示:
$provide.decorator("$exceptionHandler", ['$delegate', function($delegate) {
return function (exception, cause) {
Raygun.send(exception);
$delegate(exception, cause);
}
}])
但是,這具有順序依賴性,因為必須在DI框架首先加載$exceptionHandler
之前安裝裝飾器。 如果我將此代碼包裝在模塊中,則順序依賴性甚至不那么明顯,並且客戶端很容易以錯誤的順序初始化事物,而且不知道為什么未調用Raygun.send
。 (我是那個客戶一天半。為我辯護,這是我第一次體驗Angular。)
我想說服Angular的DI框架在$exceptionHandler
之前加載我的錯誤記錄模塊,明顯的警告是,如果在引導過程中真的引發了任何異常,我會被束之高閣。 我想到嘗試將模塊注冊為$exceptionHandler
的依賴項,但還沒有弄清楚該怎么做-而且, $exceptionHandler
依賴於我的代碼實際上並不是真的。 有我慣用的慣用方法嗎?
Angular在其自己的ng
模塊實例化期間,在其自己的配置階段實例化$exceptionHandler
和所有其他ng-
service。 只需將您的代碼移動到ng
模塊的配置中即可:
angular.module('ng')
.config(['$provide', function($provide) {
$provide.decorator('$exceptionHandler', ['$delegate', function($delegate) {
return function (exception, cause) {
Raygun.send(exception);
$delegate(exception, cause);
}
}]);
}]);
$exceptionHandler
實例化后,此配置將立即放入隊列中。
但是,配置/運行錯誤不會委托給$exceptionHandler
或任何角度記錄器,它們只是未被捕獲,一直傳播到堆棧的末尾。 您可以捕獲這些異常,但是必須手動引導angular 。 刪除ng-app屬性,然后運行以下代碼:
angular.element(document).ready(function() {
try {
angular.bootstrap(document, ['yourModule']);
} catch (exception) {
Raygun.send(exception);
throw exception;
}
});
由於兩個錯誤都通過$exceptionHandler
傳遞並在引導過程中被捕捉,因此不應有未報告的錯誤。
例子: http ://plnkr.co/edit/XsiMNA7GIbHzXyjEioxy?p = preview
打開控制台,並取消注釋第9或15行上script.js中的錯誤之一。您應該看到angular的常規錯誤處理以及虛擬的Raygun.send日志警告發送到控制台。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.