Spring AOP AfterThrowing vs. Around Advice

whi*_*erz 20 java spring-aop

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

唯一能够解决有关异常的建议就是环境建议 - 无论是我做错了什么.

任何人都可以断言,如果我想要捕获异常,我必须使用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());
  }
}
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*ell 19

Spring参考医生说:

"通过抛出异常,在匹配的方法执行退出时抛出建议运行"

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