Angular: Могу ли я убедиться, что мой модуль журналирования настроен перед $exceptionHandler при нормальных обстоятельствах?

Я пишу модуль регистрации ошибок, чтобы добавить регистрацию Raygun в приложение AngularJS. Стандартный метод заключается в регистрации декоратора для $exceptionHandler вот так:

$provide.decorator("$exceptionHandler", ['$delegate', function($delegate) {
    return function (exception, cause) {
      Raygun.send(exception);
      $delegate(exception, cause);
    }
  }])

Однако это зависит от порядка в том, что декоратор должен быть установлен до первой загрузки инфраструктуры DI. $exceptionHandler, Если я обертываю этот код в модуле, зависимость порядка становится еще менее очевидной, и клиенту легко инициализировать вещи в неправильном порядке, и он понятия не имеет, почему Raygun.send не звонят. (Я был этим клиентом полтора дня. В мою защиту это мой первый опыт работы с Angular.)

Я хотел бы убедить DI-среду Angular загрузить мой модуль регистрации ошибок до $exceptionHandler, с очевидным предостережением, что я нахожусь, если какие-либо исключения будут брошены действительно рано в начальной загрузке. Я думал о попытке зарегистрировать мой модуль как зависимость $exceptionHandler, но пока не смог понять, как это сделать - к тому же это не совсем так $exceptionHandler зависит от моего кода. Есть ли идиоматический способ сделать это, что я скучаю?

1 ответ

Угловые экземпляры $exceptionHandler и все остальное ng- сервисы во время его собственной фазы конфигурации, во время его собственной ng модуль создания экземпляров. Просто переместите свой код в конфиг 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
Откройте консоль и раскомментируйте одну из ошибок в script.js в строке 9 или 15. Вы должны увидеть регулярную обработку ошибок angular, а также фиктивные предупреждения о регистрации в журнале Raygun.send.

Другие вопросы по тегам