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.