2010-03-23 6 views
19

beim Versuch, ein Aspect zu implementieren, das für das Erfassen und Protokollieren eines bestimmten Fehlertyps verantwortlich ist, dachte ich zunächst, dass dies mit dem AfterThrowing-Hinweis möglich wäre. Es scheint jedoch, dass sein Ratschlag nicht die Ausnahme abfängt, sondern nur einen zusätzlichen Einstiegspunkt bietet, um etwas mit der Ausnahme zu tun.Spring AOP AfterThrowing vs Around Beratung

Der einzige Hinweis, der auch die fragliche Ausnahme einfangen würde, wäre dann ein AroundAdvice - entweder das oder ich habe etwas falsch gemacht.

Kann jemand behaupten, dass, wenn ich die Ausnahme abfangen möchte, ich einen AroundAdvice verwenden muss? Die von mir verwendete Konfiguration lautet:

@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()); 
    } 
} 

Beachten Sie, dass ich in diesem Beispiel alle Ausnahmen abgefangen habe, weil es nur ein Beispiel ist. Ich kenne seine schlechte Praxis, alle Ausnahmen einfach zu schlucken, aber für meinen aktuellen Anwendungsfall möchte ich, dass ein spezieller Typ von Ausnahme nur protokolliert wird, während doppelte Protokollierungslogik vermieden wird.

+0

Sie würden nicht beide Ratschläge und Ratschläge für den gleichen Joinpoint verwenden. Um Beratung ist ganzheitlich und ermöglicht es Ihnen, die Ausführung vollständig zu steuern. Da es nicht möglich ist, dass eine Ausnahme aus Ihrem Ratschlag ausgeschlossen wird (wegen des try/catch-Blocks, der die Ausnahme nicht erneut auslöst), wird der Ratschlag nach dem Werfen niemals angewendet. –

Antwort

18

Die Spring reference doc sagt:

„Nach Beratung läuft werfen, wenn ein Verfahren tritt die Abarbeitung angepasst durch Auslösen einer Ausnahme“

Bis dahin ist es zu spät, um die Ausnahme, da es zu fangen wurde bereits geworfen und die Methode wurde beendet. Die Vorgehensweise, die Sie mit dem @Around-Advice vorgenommen haben, ist die einzige Möglichkeit, die Ausnahme abzufangen und sich damit zu befassen, bevor die Methode beendet wird.

+0

Ich glaube eigentlich nicht, dass das wahr ist. Ich glaube, dass der Handler-Join-Punkt der Weg ist, die Ausnahme zu fangen und damit umzugehen, bevor die Methode beendet wird. Mithilfe von Ratschlägen können Sie die Ausnahme abfangen, nachdem die Methode die Ausnahme ausgelöst und zurückgegeben hat. Siehe http://www.eclipse.org/aspectj/doc/next/progguide/language-joinPoints.html –

+1

Ich weiß, das ist 4 Jahre später, aber diese Frage kam gerade auf einer Google-Suche. @TimHennekey, Shane hat Recht. Nach dem Werfen kann der Hinweis nicht verhindern, dass die Ausnahme ausgelöst wird (zumindest nicht mit Spring AOP). Ich weiß, weil ich es gerade versucht habe (mit Spring-Aop 3.2.9). Wenn Sie die Ausnahme abfangen möchten, verwenden Sie den Ratschlag, da Sie damit die Ausführung vollständig steuern können. –

Verwandte Themen