2010-03-23 13 views
19

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.

+0

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

risposta

18

Il Spring reference dottore dice:

"Dopo aver lanciato eseguito consigli quando un abbinati uscite metodo di esecuzione da un'eccezione"

A quel punto è troppo tardi per prendere l'eccezione in quanto è già stato lanciato e il metodo è uscito. L'approccio che hai seguito con il consiglio @Around è l'unico modo per individuare l'eccezione e gestirla prima che il metodo venga chiuso.

+0

In realtà non penso che sia vero. Credo che il punto di unione del gestore sia il modo per individuare l'eccezione e gestirla prima che il metodo esca. I consigli intorno ti permetteranno di rilevare l'eccezione dopo che il metodo ha lanciato l'eccezione e restituito. Si prega di consultare http://www.eclipse.org/aspectj/doc/next/progguide/language-joinPoints.html –

+1

So che questo è 4 anni più tardi, ma questa domanda è appena arrivata su una ricerca di Google. @TimHennekey, Shane è corretto. Dopo aver lanciato il consiglio non è possibile evitare che l'eccezione venga lanciata (almeno non con Spring AOP). Lo so perché l'ho appena provato (con spring-aop 3.2.9). Se vuoi cogliere l'eccezione, è il momento in cui dovresti usare il consiglio, perché ciò ti darebbe il controllo completo dell'esecuzione. –

Problemi correlati