Spring AOP异常处理如果有catch块,则不执行建议

时间:2018-06-19 09:27:39

标签: java spring aspectj spring-aop

我正在使用Spring AOP来记录我班级中的异常。它应该记录在类的每个方法中抛出的所有异常。

@AfterThrowing(pointcut = "execution(* *.*(..))", throwing = "e")
protected void method(JoinPoint joinPoint,Exception e) throws Throwable {

但是,如果该方法具有捕获异常的try catch块,则不会触发建议。如果我删除try catch块并在方法定义中添加throws子句,则调用advice。这是AOP应该如何工作因为它没有意义吗?我只想在一个地方而不是在每个方法中为所有异常处理一般的异常处理代码。

2 个答案:

答案 0 :(得分:2)

是的,这就是它应该如何工作的。 “建议之后”一词已在建议插入时说明:目标方法抛出异常之后。但是,您的方法会捕获并且永远不会抛出要拦截的异常。那你该怎么办?

  • 您必须在呼叫链上拦截一个或多个级别,或者
  • 您已从Spring AOP升级到AspectJ,并使用handler()切入点,以按AspectJ manual中所述拦截方法中的catch块。您还可以在my answer to another question中找到handler()的示例代码。 Spring manual中介绍了如何使用LTW激活完整的AspectJ。

作为旁注,我想知道为什么您首先尝试拦截(希望正确地)处理的异常。您的示例代码在哪里?您的用例是什么?

答案 1 :(得分:1)

如果您使用 try catch 在方法中处理异常,则该方法不会抛出该异常。 AOP只关心方法的输入和输出,把它当作一个黑盒子,不关心方法内部发生了什么。

也许您可以将 try catch 移至调用方法。