web-dev-qa-db-ja.com

$ exceptionHandler実装をオーバーライドする方法

Javascript例外がスローされるたびに、やりたいことがいくつかあります。

$exceptionHandlerのドキュメントから:

angular式のキャッチされない例外は、このサービスに委任されます。デフォルトの実装は、ブラウザコンソールにログインする$ log.errorに委任するだけです。

「デフォルトの実装」と書かれているという事実は、サービスに独自の実装を提供し、例外がスローされたときに必要なことを行う方法があると思うようにします。私の質問は、これをどのように行うのですか?このサービスへのすべての例外を保持しつつ、実現したい機能を提供するにはどうすればよいですか?

72
dnc253

このために私が見つけた別のオプションは、$exceptionHandlerを通じて $ provide.decorator 関数。これにより、カスタム実装の一部として使用する場合、元の実装への参照が提供されます。したがって、次のようなことができます。

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

元の例外ハンドラーが行うことと、カスタム機能を実行します。

こちらをご覧ください 更新されたフィドル

173
dnc253

同じ名前のサービスを作成することにより、$exceptionHandler機能をオーバーライドできます。

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

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

サンプルについては、 this fiddle を参照してください。 $exceptionHandlerのファクトリー定義をコメント化すると、アラートではなくエラーがコンソールに記録されます。

$httpを使用して$injectorのような他のサービスを注入する例がある group thread は次のとおりです。

注:$exceptionHandler(または別の組み込みサービス)の既存の機能を上書きしたくない場合は、 サービスを装飾する方法については、この回答

56
Gloopy