web-dev-qa-db-fra.com

Comment remplacer l'implémentation de $ exceptionHandler

Il y a des choses supplémentaires que nous voulons faire chaque fois qu'une exception javascript est levée.

Depuis les documents sur $exceptionHandler:

Toute exception non capturée dans les expressions angular sont déléguées à ce service. L'implémentation par défaut délègue simplement à $ log.error qui la connecte à la console du navigateur.

Le fait qu'il indique "implémentation par défaut" me fait penser qu'il existe un moyen de fournir notre propre implémentation pour le service et de faire les choses que nous voulons lorsqu'une exception est levée. Ma question est, comment faites-vous cela? Comment pouvons-nous conserver toutes les exceptions pour ce service, mais fournir ensuite les fonctionnalités souhaitées?

72
dnc253

Une autre option que j'ai trouvée pour cela est de "décorer" le $exceptionHandler via la fonction $ provide.decorator . Cela vous fournit une référence à l'implémentation d'origine si vous souhaitez l'utiliser dans le cadre de votre implémentation personnalisée. Vous pouvez donc faire quelque chose comme ceci:

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

Il fera ce que fait le gestionnaire d'exceptions d'origine, ainsi que des fonctionnalités personnalisées.

Voir ceci violon mis à jour .

173
dnc253

Vous pouvez remplacer le $exceptionHandler fonctionnalité en créant un service du même nom:

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

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

Voir ce violon pour un exemple. Si vous commentez la définition d'usine de $exceptionHandler vous verrez que l'erreur se connectera à la console au lieu de l'alerter.

Voici un thread de groupe qui a un exemple d'injection d'autres services comme $http en utilisant $injector.

Remarque: si vous ne souhaitez pas remplacer les fonctionnalités existantes du $exceptionHandler (ou un autre service intégré) voir cette réponse pour plus d'informations sur la façon de décorer un service.

56
Gloopy