Spring AOP AfterThrowing vs. Around Advice

当我试图实现一个负责捕获和记录某种类型错误的Aspect时,我最初认为这可以使用AfterThrowing建议。 然而,似乎他的建议没有捕获exception,但只是提供了一个额外的入口点来做exception的事情。

唯一能够解决有关exception的建议就是环境建议 – 或者我做错了。

任何人都可以断言,如果我想要捕获exception,我必须使用AroundAdvice吗? 我使用的配置如下:

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

请注意,在此示例中,我捕获了所有exception,因为它只是一个示例。 我知道只是吞下所有exception的坏习惯,但对于我当前的用例,我希望只记录一种特殊类型的exception,同时避免重复记录逻辑。

Spring参考文档说:

“抛出建议后,通过抛出exception退出匹配的方法执行”

到那时为止已经太晚了,因为它已经被抛出并且该方法已经退出。 你使用@Around建议的方法是实际捕获exception并在方法退出之前处理它的唯一方法。