quando si tenta di implementare un Aspect, che è responsabile per la cattura e la registrazione di un determinato tipo di errore, inizialmente ho pensato che sarebbe stato possibile utilizzare il consiglio AfterThrowing. Tuttavia sembra che il suo consiglio non cogli l'eccezione, ma fornisce solo un punto di accesso aggiuntivo per fare qualcosa con l'eccezione.Spring AOP AfterThrowing vs. Around Advice
L'unico consiglio che potrebbe anche rilevare l'eccezione in questione sarebbe quindi un AroundAdvice - o quello o ho fatto qualcosa di sbagliato.
Qualcuno può affermare che, in effetti, se voglio rilevare l'eccezione, devo utilizzare un AroundAdvice? La configurazione che ho usato è la seguente:
@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());
}
}
Si noti che in questo esempio sono state rilevate tutte le eccezioni, perché è solo un esempio. Conosco le sue cattive abitudini solo per ingoiare tutte le eccezioni, ma per il mio caso di utilizzo corrente desidero che venga registrato un solo tipo speciale di eccezione evitando la logica di registrazione duplicata.
Davvero non usereste entrambi i consigli e dopo aver lanciato consigli sullo stesso punto di vista come questo. Around advice è olistico e ti permette di controllare completamente l'esecuzione. Dal momento che non è possibile che un'eccezione venga scartata dai tuoi consigli (a causa del blocco try/catch che hai non rilancia l'eccezione), il consiglio di lancio successivo non verrà mai applicato. –