在抛出javascript异常的任何时候我们都想做一些额外的事情。
来自$exceptionHandler
上的文档:
角度表达式中任何未捕获的异常都会委托给此服务。默认实现只是委托给$ log.error,它将其记录到浏览器控制台中。
它说“默认实现”这一事实让我觉得有一种方法可以为服务提供我们自己的实现,并在抛出异常时执行我们想要的东西。我的问题是,你是怎么做到的?我们如何将所有异常保留在此服务中,然后提供我们想要发生的功能?
答案 0 :(得分:173)
我发现的另一个选择是通过$provide.decorator函数“装饰”$exceptionHandler
。如果要将其用作自定义实现的一部分,这将为您提供对原始实现的引用。所以,你可以这样做:
mod.config(function($provide) {
$provide.decorator("$exceptionHandler", ['$delegate', function($delegate) {
return function(exception, cause) {
$delegate(exception, cause);
alert(exception.message);
};
}]);
});
它将执行原始异常处理程序的功能,以及自定义功能。
请参阅此updated fiddle。
答案 1 :(得分:56)
您可以通过创建具有相同名称的服务来覆盖$exceptionHandler
功能:
var mod = angular.module('testApp', []);
mod.factory('$exceptionHandler', function () {
return function (exception, cause) {
alert(exception.message);
};
});
有关示例,请参阅this fiddle。如果您注释掉$exceptionHandler
的工厂定义,您将看到错误将记录到控制台而不是警告它。
以下是group thread,其中包含使用$http
注入$injector
等其他服务的示例。
注意:如果您不想覆盖$exceptionHandler
(或其他内置服务)的现有功能,请参阅this answer,了解有关如何装饰服务。
答案 2 :(得分:-5)
你可以覆盖任何服务/工厂甚至是$ cookieStore。如果你想要一个完整的,可配置的对象,这里是a really nice example:
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(),
}