尝试实现负责捕获和记录某种类型错误的Aspect时,我最初认为可以使用AfterThrowing建议来实现。但是,他的建议似乎并没有捕获到异常,而只是提供了一个额外的切入点来对异常进行处理。
然后,唯一也可以捕获有关异常的建议就是AroundAdvice-要么是我做错了事,要么是我做错了事。
有人可以断言,如果我想捕获异常,必须使用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()); } }
请注意,在此示例中,我捕获了所有异常,因为这只是一个示例。我知道吞没所有异常是一种不好的做法,但是对于我当前的用例,我希望只记录一种特殊类型的异常,同时避免重复的记录逻辑。
在Spring参考医生说:
“在抛出建议后,当匹配的方法执行因抛出异常而退出时运行”
到那时,捕获异常已经为时已晚,因为该异常已经引发并且该方法已退出。@Around建议所采用的方法是实际捕获异常并在方法退出之前对其进行处理的唯一方法。