2010-03-23 11 views
19

al intentar implementar un aspecto, que es responsable de atrapar y registrar un cierto tipo de error, al principio pensé que esto sería posible usando el consejo de AfterThrowing. Sin embargo, parece que su consejo no capta la excepción, sino que proporciona un punto de entrada adicional para hacer algo con la excepción.Spring AOP AfterThrowing vs. Around Advice

El único consejo que también captaría la excepción en cuestión sería entonces un AroundAdvice, ya sea eso o hice algo mal.

¿Alguien puede afirmar que, de hecho, si quiero ver la excepción, tengo que usar un AroundAdvice? La configuración que utilicé sigue:

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

Tenga en cuenta que en este ejemplo capté todas las excepciones, porque es solo un ejemplo. Sé que es una mala práctica el solo tragar todas las excepciones, pero para mi caso de uso actual quiero que solo se registre un tipo especial de excepción mientras se evita la lógica de registro duplicado.

+0

Realmente no usarías ambos consejos y después de lanzar consejos sobre el mismo punto de unión como este. Around advice es holístico y te permite controlar completamente la ejecución. Dado que no es posible excluir una excepción de su recomendación de acercamiento (debido al bloque try/catch que tiene, que no vuelve a lanzar la excepción), el consejo posterior al lanzamiento nunca se aplicará. –

Respuesta

18

El doc Spring reference dice:

"Después de lanzar carreras de asesoramiento cuando un emparejados salidas de ejecución método por el lanzar una excepción"

Por entonces ya es demasiado tarde para detectar la excepción, ya que ya ha sido lanzado y el método ha salido. El enfoque que ha tomado con el asesoramiento @Around es la única forma de atrapar realmente la excepción y tratarla antes de que el método finalice.

+0

En realidad, no creo que esto sea cierto. Creo que el punto de unión del manejador es la forma de atrapar la excepción y manejarla antes de que el método finalice. Around advice le permitirá capturar la excepción después de que el método arrojó la excepción y la devolvió. Consulte http://www.eclipse.org/aspectj/doc/next/progguide/language-joinPoints.html –

+1

Sé que esto es 4 años más tarde, pero esta pregunta acaba de aparecer en una búsqueda en Google. @TimHennekey, Shane tiene razón. Después de lanzar consejos, no puede evitar que se arroje la excepción (al menos no con Spring AOP). Lo sé porque lo probé (con Spring-aop 3.2.9). Si quieres ver la excepción, es cuando usarías todo el consejo, porque eso te daría un control completo de la ejecución. –