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