如何覆盖 $ExceptionHandler 实现

当抛出 javascript 异常时,我们需要做一些额外的事情。

来自 $exceptionHandler台的文档:

角表达式中任何未捕获的异常都委托给此服务。默认实现只是委托给 $log.error,后者将其记录到浏览器控制台中。

事实上它说的是“默认实现”,这让我觉得我们可以为服务提供自己的实现,并在抛出异常时做我们想做的事情。我的问题是,你是怎么做到的?我们如何能够让所有异常都发生在这个服务上,然后提供我们希望发生的功能呢?

31859 次浏览

您可以通过创建具有相同名称的服务来覆盖 $exceptionHandler功能:

var mod = angular.module('testApp', []);


mod.factory('$exceptionHandler', function () {
return function (exception, cause) {
alert(exception.message);
};
});

有关样本,请参见 这把小提琴。如果注释掉 $exceptionHandler的工厂定义,您将看到错误将记录到控制台,而不是通知它。

下面是一个 群线群线群线群线,它有一个使用 $injector注入其他服务(如 $http)的示例。

注意: 如果您不想覆盖 $exceptionHandler(或其他内置服务)的现有功能,请参阅 这个答案以获得关于如何装饰服务的信息。

我发现的另一个选项是通过 $提供,装潢师函数“装饰”$exceptionHandler。如果您希望将原始实现用作自定义实现的一部分,这将为您提供对原始实现的引用。所以,你可以这样做:

mod.config(function($provide) {
$provide.decorator("$exceptionHandler", ['$delegate', function($delegate) {
return function(exception, cause) {
$delegate(exception, cause);
alert(exception.message);
};
}]);
});

它将执行原始异常处理程序所执行的操作,以及自定义功能。

看这个 更新小提琴

您可以覆盖任何服务/工厂,甚至 $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(),
}