簡體   English   中英

Angular:在正常情況下,我可以確保在$ exceptionHandler之前配置我的日志記錄模塊嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM