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.
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. –