每当抛出javascript异常时,我们还想做一些额外的事情。
从以下文档$exceptionHandler
:
角度表达式中任何未捕获的异常都委托给此服务。默认实现只是将$ log.error委托给浏览器控制台。
它说“默认实现”的事实使我认为有一种方法可以为服务提供我们自己的实现,并在引发异常时做我们想要的事情。我的问题是,你如何做到这一点?我们如何使所有异常都保留给该服务,然后提供我们希望发生的功能?
Answers:
我为此找到的另一个选择是$exceptionHandler
通过$ provide.decorator函数“装饰” 。如果要将原始实现用作自定义实现的一部分,则可以为您提供参考。因此,您可以执行以下操作:
mod.config(function($provide) {
$provide.decorator("$exceptionHandler", ['$delegate', function($delegate) {
return function(exception, cause) {
$delegate(exception, cause);
alert(exception.message);
};
}]);
});
它将执行原始异常处理程序所做的事情,以及自定义功能。
请参阅此更新的小提琴。
您可以$exceptionHandler
通过创建具有相同名称的服务来覆盖功能:
var mod = angular.module('testApp', []);
mod.factory('$exceptionHandler', function () {
return function (exception, cause) {
alert(exception.message);
};
});
有关示例,请参见此小提琴。如果注释掉出厂定义,$exceptionHandler
您将看到错误将记录到控制台而不是发出警报。
这是一个组线程,其中包含注入其他服务(例如$http
using)的示例$injector
。
注意:如果您不想覆盖$exceptionHandler
(或其他内置服务)的现有功能,请参见此答案以获取有关如何装饰服务的信息。
您可以覆盖任何服务/工厂甚至$ cookieStore。如果您想要一个完整的可配置对象,这是一个非常好的示例:
var myApp = angular.module('myApp', []);
//provider style, full blown, configurable version
myApp.provider('helloWorld', function() {
this.name = 'Default';
this.$get = function() {
var name = this.name;
return {
sayHello: function() {
return "Hello, " + name + "!"
}
}
};
this.setName = function(name) {
this.name = name;
};
});
//hey, we can configure a provider!
myApp.config(function(helloWorldProvider){
helloWorldProvider.setName('World');
});
function MyCtrl($scope, helloWorld, helloWorldFromFactory, helloWorldFromService) {
helloWorld.sayHello(),
}