1

我创建了一个引发异常的@Before Advice,并试图在另一个@AfterThrowing 中捕获它,但它不起作用。

如果异常没有在通知中抛出,而是直接在方法中抛出,它会起作用。

如果在通知中抛出它,则不会执行 @AfterThrowing。

为什么它会这样?

4

2 回答 2

0

因为意味着:捕获捕获的方法@AfterThrowing中抛出异常的事件。但是意味着:在捕获的方法之前(即外部)做一些事情。因此,您的控制流永远不会达到可以满足建议条件的地步。@Before@AfterThrowing

所以要么你按照弗兰克告诉你的去做(使用@Around建议),要么,如果你可以控制调用者以及代码的被调用者部分,你可以这样做(非常丑陋):

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

我没有测试过它,但是由于这个控制流它应该可以工作:

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

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

于 2012-09-04T12:07:18.483 回答
0

我想这两个建议是在同一方面?如果没有,您是否声明了定义编织顺序的优先级?

无论如何,如果你想在一个方法之前做某事,然后根据你之前所做的事情做某事,你应该使用一个@Around建议来代替。您甚至可能不需要异常(代价高昂)来以这种方式控制流程。

于 2012-09-04T11:27:58.003 回答