我创建了一个@Before Advice,它抛出一个异常并尝试在另一个@AfterThrowing中捕获它,但它不起作用。
如果建议中没有抛出异常,但直接在方法中抛出异常,则可以正常工作。
如果在建议中抛出,则不执行@AfterThrowing。
为什么它会像那样?
答案 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]
即。 “执行前”已经“在通话中”。