2010-11-29 25 views
3

Je donne les résultats suivants:Pourquoi @AfterReturning n'est-il exécuté qu'après @AfterThrowing en cas d'exception?

@AfterReturning("executionOfTrustedAnnotatedMethod()") 
public void afterReturningFromTrustedMethodExecution() { ... } 

@AfterThrowing(pointcut = "executionOfTrustedAnnotatedMethod()") 
public void afterThrowingByExecutionOfTrustedAnnotatedMethod() { ... } 

Et Im observant ce comportement qui n'a pas de sens pour moi:

  • Si la méthode capturée par ce pointcut ne jette pas une exception, @AfterReturning est exécuté
  • Si la méthode renvoie une exception, @AfterReturning est exécutée seulement si @AfterThrowing existe et est exécuté en premier

Ce que j'essaye d'accomplir est d'exécuter du code à la fin de l'exécution d'une méthode indépendamment de si une exception a été levée ou non. Mais maintenant ce code s'exécute deux fois (si j'ai à la fois afterReturning et afterThrowing) ou pas du tout (si j'ai seulement afterReturning) si une exception est levée.

Des suggestions?

Merci, Piotr

Répondre

6

Si vous voulez exécuter un code après méthode, peu importe s'il y avait une exception levée ou non, vous devez utiliser @After à la place.

+0

Parfait! Merci;) Avez-vous une idée pourquoi j'ai eu ce comportement étrange? Juste par curiosité. –

+0

@Piotr: Je ne sais pas. Ça a l'air étrange, en effet. – axtavt