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

0

Я пишу модуль регистрации ошибок, чтобы добавить запись 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 зависит от моего кода. Есть ли идиоматический способ сделать это, что мне не хватает?

Теги:
dependency-injection
raygun

1 ответ

0

Угловая конкретизирует $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.

Однако ошибки config/run не делегируются $exceptionHandler или любому угловому регистратору, они просто не отображаются, распространяются до конца стека. Вы можете захватить эти исключения, но вы должны вручную бутстрапировать угловые. Удалите атрибут приложения ng- и вместо этого запустите этот код:

angular.element(document).ready(function() {
    try {
        angular.bootstrap(document, ['yourModule']);
    } catch (exception) {
        Raygun.send(exception);
        throw exception;
    }
});

Если обе ошибки пойманы, пройдя через $exceptionHandler и пойманные во время начальной загрузки, не должно быть ошибок, о которых не сообщается.

Пример plunker: http://plnkr.co/edit/XsiMNA7GIbHzXyjEioxy?p=preview
Откройте консоль и раскомментируйте одну из ошибок в файле script.js в строке 9 или 15. Вы должны увидеть угловую регулярную обработку ошибок, а также пустые предупреждения о протоколе Raygun.send на консоли.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню