2010-03-23 3 views
19

en essayant de mettre en œuvre un aspect, qui est responsable de la capture et l'enregistrement d'un certain type d'erreur, je pensais au départ que ce serait possible en utilisant les conseils AfterThrowing. Cependant, il semble que son conseil n'attrape pas l'exception, mais fournit simplement un point d'entrée supplémentaire pour faire quelque chose avec l'exception.Spring AOP AfterThrowing contre Around conseils

Le seul conseil qui a également Intercepter l'exception en question serait alors un AroundAdvice - ça ou je l'ai fait quelque chose de mal.

Quelqu'un peut-il affirmer que bien si je veux attraper l'exception que je dois utiliser un AroundAdvice? La configuration je suit:

@Pointcut("execution(* test.simple.OtherService.print*(..))") 
public void printOperation() {} 

@AfterThrowing(pointcut="printOperation()", throwing="exception") 
public void logException(Throwable exception) { 
    System.out.println(exception.getMessage()); 
} 

@Around("printOperation()") 
public void swallowException(ProceedingJoinPoint pjp) throws Throwable { 
    try { 
    pjp.proceed(); 
    } catch (Throwable exception) { 
    System.out.println(exception.getMessage()); 
    } 
} 

Notez que dans cet exemple, je pris toutes les exceptions, car il est juste un exemple. Je connais sa mauvaise habitude d'avaler toutes les exceptions, mais pour mon cas d'utilisation actuel, je veux qu'un type spécial d'exception soit simplement enregistré tout en évitant la logique de journalisation en double.

+0

Vous vraiment ne serait pas utiliser à la fois autour des conseils et après avoir jeté des conseils sur la même joinpoint comme celui-ci. Autour du conseil est holistique et vous permet de contrôler complètement l'exécution. Comme il n'est pas possible qu'une exception soit ignorée par votre conseil (à cause du bloc try/catch que vous avez qui ne relance pas l'exception), le conseil after throw ne sera jamais appliqué. –

Répondre

18

Le Spring reference doc dit:

« Après avoir lancé des pistes de conseils lorsqu'un sorties d'exécution de la méthode en correspondance par lancer une exception »

il est alors trop tard pour attraper l'exception comme a déjà été jeté et la méthode est sortie. L'approche que vous avez adoptée avec le conseil @Around est le seul moyen d'attraper l'exception et de la gérer avant la fin de la méthode.

+0

Je ne pense pas que ce soit vrai. Je crois que le point de jointure du gestionnaire est le moyen d'attraper l'exception et de la traiter avant que la méthode ne se termine. Autour du conseil vous permettra d'attraper l'exception après que la méthode a levé l'exception et est revenue. S'il vous plaît voir http://www.eclipse.org/aspectj/doc/next/progguide/language-joinPoints.html –

+1

Je sais que c'est 4 ans plus tard, mais cette question vient de sur une recherche Google. @ TimHennekey, Shane est correct. Après avoir lancé un avis ne peut pas empêcher l'exception d'être lancé (au moins pas avec Spring AOP). Je sais parce que je viens de l'essayer (avec spring-anop 3.2.9). Si vous voulez attraper l'exception, c'est à ce moment-là que vous utiliserez des conseils, car cela vous donnerait le contrôle total de l'exécution. –

Questions connexes