Java 如果存在catch块,则不会执行Spring AOP异常处理建议

Java 如果存在catch块,则不会执行Spring AOP异常处理建议,java,spring,aspectj,spring-aop,Java,Spring,Aspectj,Spring Aop,我正在使用SpringAOP记录我的类中的异常。它应该记录类的每个方法中抛出的所有异常 @AfterThrowing(pointcut = "execution(* *.*(..))", throwing = "e") protected void method(JoinPoint joinPoint,Exception e) throws Throwable { 但是,如果该方法具有捕获异常的try-catch块,则不会触发通知。如果在方法定义中删除try-catch块和add-throws

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

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

但是,如果该方法具有捕获异常的try-catch块,则不会触发通知。如果在方法定义中删除try-catch块和add-throws子句,则会调用advice。AOP就是这样工作的,因为它毫无意义吗?我只需要一个通用的异常处理代码,用于一个地方的所有异常,而不是每个方法中的所有异常。

是的,这就是它应该如何工作的。术语“抛出后”已经说明了建议何时生效:在目标方法抛出异常之后。但是,您的方法捕获并从不抛出您想要拦截的异常。那你能做什么呢

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

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

是的,它应该是这样工作的。术语“抛出后”已经说明了建议何时生效:在目标方法抛出异常之后。但是,您的方法捕获并从不抛出您想要拦截的异常。那你能做什么呢

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

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

如果您使用try-catch处理方法中的异常,那么该方法不会引发该异常。 AOP只关心方法的输入和输出,并将其视为一个黑匣子,而不关心方法内部的情况


也许可以将try-catch移到调用方法。

如果使用try-catch处理方法中的异常,则该方法不会引发该异常。 AOP只关心方法的输入和输出,并将其视为一个黑匣子,而不关心方法内部的情况


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

可能与@VladBochenin相关,您链接的另一个问题与此问题完全无关。可能与@VladBochenin相关,您链接的另一个问题与此问题完全无关。谢谢@kriegaex,我认为SpringAOP比完整的AspectJ更容易实现,并且与我在web应用程序上的工作更相关。我的用例是希望避免使用锅炉板日志代码。我想在一个地方为多个类和方法记录方法的进入和退出以及异常。在异常中,我想记录方法名、异常、参数。方法入口-出口建议对我的DAO很有效,但我不知道如何为我的servlet实现,因为它不是spring应用程序,spring AOP只对spring注入的bean有效。异常建议没有按预期的那样工作,因为我不能将未捕获的异常从DAO抛出到servlet。我需要在DAO和servlets中记录异常,我的解释已经回答了这些问题:使用AspectJ而不是SpringAOP。AspectJ可以与Spring一起使用,但在其他方面是完全不相关和独立的,如果配置正确,它可以与任何Java(或其他JVM语言)应用程序一起工作。所以我希望你能接受我的回答。谢谢。谢谢@kriegaex,我认为SpringAOP比完整的AspectJ更容易实现,而且与我在web应用程序上的工作更相关。我的用例是希望避免使用锅炉板日志代码。我想在一个地方为多个类和方法记录方法的进入和退出以及异常。在异常中,我想记录方法名、异常、参数。方法入口-出口建议对我的DAO很有效,但我不知道如何为我的servlet实现,因为它不是spring应用程序,spring AOP只对spring注入的bean有效。异常建议没有按预期的那样工作,因为我不能将未捕获的异常从DAO抛出到servlet。我需要在DAO和servlets中记录异常,我的解释已经回答了这些问题:使用AspectJ而不是SpringAOP。AspectJ可以与Spring一起使用,但在其他方面是完全不相关和独立的,如果配置正确,它可以与任何Java(或其他JVM语言)应用程序一起工作。所以我希望你能接受我的回答。谢谢