73

每当抛出 javascript 异常时,我们都想做一些额外的事情。

从上的文档$exceptionHandler

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

它说“默认实现”的事实让我认为有一种方法可以为服务提供我们自己的实现,并在抛出异常时做我们想要的事情。我的问题是,你是怎么做到的?我们如何才能让所有异常都转到该服务,然后提供我们想要发生的功能?

4

3 回答 3

173

我为此找到的另一个选择是$exceptionHandler通过$provide.decorator函数“装饰”。如果您想将其用作自定义实现的一部分,这将为您提供对原始实现的引用。因此,您可以执行以下操作:

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

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

看到这个更新的小提琴

于 2013-06-05T14:46:15.173 回答
56

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

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

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

请参阅此小提琴以获取示例。如果您注释掉工厂定义,$exceptionHandler您将看到错误将记录到控制台而不是警告它。

这是一个组线程,其中有一个注入其他服务的示例,例如$http使用$injector.

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

于 2012-11-28T00:24:06.733 回答
-5

您可以覆盖任何服务/工厂,甚至 $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(),
}
于 2013-07-13T15:44:54.710 回答