当前位置: 首页 > 知识库问答 >
问题:

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

徐丰茂
2023-03-14

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

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

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

共有2个答案

施雅懿
2023-03-14

如果使用try捕获处理方法中的异常,则该方法不会抛出该异常。AOP只关心方法的输入和输出,并将其视为黑盒,而不关心方法内部发生了什么。

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

翟默
2023-03-14

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

  • 您必须在呼叫链的一个或多个级别拦截它,或者
  • 您可以从Spring AOP升级到AspectJ,并使用handler()pointcut来拦截方法中的catch块,如AspectJ手册所述。您还可以在我对另一个问题的回答中找到handler()的示例代码。Spring手册中描述了如何使用LTW激活完整的AspectJ

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

 类似资料:
  • 问题内容: 如果catch和finally块都抛出异常会怎样? 问题答案: 当该块引发异常时,它将有效地隐藏从该块引发的异常,并将最终引发该异常。因此,重要的是要么在捕获时记录异常,要么确保finally块本身不会引发异常,否则,您将得到被扼杀且从未见过的异常​​。

  • 无法使用由try和catch块包围的@controlleradvice和@afterthollow when方法。 我可以一步一步解释 }

  • 我应该知道这一点,但不知为何我现在还想不出来。 是否有方法重写此代码以避免?

  • 问题内容: 我很沮丧,我不知道该怎么做。 基本上,我只想创建一个表,但是如果它存在,则需要将其删除并重新创建,而不是将其截断,但是如果不存在,则可以创建它。 有人可以帮忙吗? 谢谢乔治 问题答案: 放在tablename您的发言之前。 该语句将删除该表(如果存在),但如果不存在则不会引发错误。

  • 问题内容: 在一个教程中,我发现 您的代码无法处理Unchecked Exception, 即我们不能使用块,示例是类似的异常,但是可以使用try / catch块处理这些异常。我认为我不清楚这个概念! 我也认为throw关键字只能与block.can一起使用吗? 问题答案: 已检查和未检查的异常之间的唯一区别是,必须使用捕获或在方法签名中声明 已 检查的异常,而对于未检查的异常,这是可选的。 您

  • 当使用try/catch块时,我们可以使用e打印catch块中的堆栈跟踪。printStacktrace()方法。 如果出现未处理的异常,仍会打印堆栈跟踪。 谁在控制台上打印堆栈跟踪?怎么做?