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