73

JavaScript 例外がスローされるたびに、いくつかの追加処理を実行する必要があります。

ドキュメントから$exceptionHandler

angular 式でキャッチされなかった例外は、このサービスに委譲されます。デフォルトの実装は、ブラウザ コンソールにログを記録する $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);
        };
    }]);
});

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

この更新された fiddleを参照してください。

于 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 に答える