AOP gestion des exceptions
Je vois que Guice et de Printemps de l'utilisation de l'AOP Alliance sous le capot pour la méthode interceptions, et j'ai été à essayer de comprendre comment obtenir de l'AOP Alliance d'intercepter et de traiter certaines exceptions, donc je n'ai pas de continuer à écrire le même code à l'intérieur de chaque catch
bloc.
Mais après examen de la pièce, il ne ressemble pas à de l'AOP Alliance fournit aucune façon à intercepter jeté Throwable
s de telle manière que le gestionnaire/intercepteur peut faire certaines choses (journal de l'exception, etc.) et puis déterminer si ou de ne pas propager l'exception de toute autre, ou simplement à récupérer de retour à la ligne suivante après la ligne qui a déclenché l'exception:
HerpDerp hd = null;
if(hd == null)
throw new RuntimeException("Herpyl derp!");
Manny.pacquiao();
Je suis à la recherche d'un AOP exception d'un mécanisme de gestion qui permettrait d'intercepter le RuntimeException
et l'utilisation de la logique métier de décider s'il convient de conserver à la propager ou à récupérer de retour à la Manny.pacquioa()
appel.
- Si il est juste pas possible de le faire en Java, s'il vous plaît laissez-moi savoir
- Indépendamment de si oui ou non il est possible de le faire en Java, il est un moyen d'intercepter la levée d'une Exception avec AOP Alliance ou je dois aller quelque part d'autre. Et si je dois aller quelque part d'autre, où? AspectJ?
Merci!
Vous devez vous connecter pour publier un commentaire.
Vous pouvez intercepter des exceptions avec Spring AOP, mais je ne sais pas si cela correspond à votre exigence pour un pur Java cadre.
Avec le Printemps, vous pouvez écrire un simple AOP intercepteur quelque chose comme:
mais il n'y a aucun moyen de retour à l'appel de la méthode ou de poursuivre le traitement sur la ligne suivante. Toutefois, si vous gérer l'exception, ici, il ne sera pas de la bulle jusqu'à la chaîne, à moins que vous renvoyer vous-même.
Il ya une raison que cela n'existe pas. Elle aurait besoin de réécrire le bloc de la structure de votre code comme si tu avais écrit le bloc try/catch dans la première place. Cela, il me semble, peut jouer des ravages avec la portée des variables et d'autres choses. Vous vous posez la question de l'AOP à réécrire le code d'octets pour être quelque chose comme le code suivant, qui est tout à fait une réécriture.
À "attraper" les exceptions non traitées avec AspectJ, vous pouvez utiliser les formats suivants:
Je ne pense pas qu'il est possible de "revenir" à l'exécution de point.
Join point: a point during the execution of a program, such as the execution of a method or the handling of an exception. In Spring AOP, a join point always represents a method execution.
@4herpsand7derpsago Si ce que vous essayez de faire est de reprendre la levée d'une exception à l'aide de l'AOP pour effectuer diverses tâches à gérer et puis revient à l'endroit du code où l'exception à l'origine jeté, je pense que vous manquez comprendre le concept de l'AOP.
Comme vous le soulignez dans votre code
Si vous voulez de l'AOP pour attraper votre
RuntimeException
, effectuer quelques trucs à gérer et revient àManny.pacquiao();
, la réponse est vous ne pouvez pas.La raison en est que lorsque le
RuntimeException
est levée et l'a attrapé par l'AOP, la pile est déjà à votre AOP code. vous ne pouvez pas vous revient à exécuterMany.pacquiao();
. La seule façon que si vous voulez poursuivre l'exécution deMany.pacquiao();
est par l'utilisation detry-finally
bloc de suivreAlors seulement votre
Many.pacquiao()
sera exécuté, mais avant que votre AOP attraper leRuntimeException