在@Before中抛出异常,捕获@AfterThrowing

时间:2012-09-04 11:22:14

标签: java spring aspectj aspect

我创建了一个@Before Advice,它抛出一个异常并尝试在另一个@AfterThrowing中捕获它,但它不起作用。

如果建议中没有抛出异常,但直接在方法中抛出异常,则可以正常工作。

如果在建议中抛出,则不执行@AfterThrowing。

为什么它会像那样?

2 个答案:

答案 0 :(得分:0)

我认为这两个建议是相同的?如果没有,您是否已声明优先顺序来定义编织顺序?

无论如何,如果你想在一个方法之前做一些事情,并且根据你以前做过的事情,你应该使用@Around建议。您可能甚至不需要例外(这是昂贵的)来控制流程。

答案 1 :(得分:0)

因为@AfterThrowing表示:捕获从捕获的方法中引发异常的事件。但@Before表示:在(即外部)捕获的方法之前执行操作。因此,您的控制流程永远不会达到满足@AfterThrowing建议条件的程度。

所以你要么做Frank告诉你的事情(使用@Around建议),或者,如果你可以控制调用者以及代码的被调用者部分,你可以这样做(非常难看):< / p>

  • @Before("execution(myMethod)")(可能抛出异常)
  • AfterThrowing("call(myMethod)")

我还没有对它进行测试,但是由于这个控制流程它应该可以工作:

[before call]
call(myMethod)
  [before execution]
  execution(myMethod)
  [after execution]
[after call]

即。 “执行前”已经“在通话中”。