我创建了一个引发异常的@Before Advice,并试图在另一个@AfterThrowing 中捕获它,但它不起作用。
如果异常没有在通知中抛出,而是直接在方法中抛出,它会起作用。
如果在通知中抛出它,则不会执行 @AfterThrowing。
为什么它会这样?
因为意味着:捕获从捕获的方法@AfterThrowing
中抛出异常的事件。但是意味着:在捕获的方法之前(即外部)做一些事情。因此,您的控制流永远不会达到可以满足建议条件的地步。@Before
@AfterThrowing
所以要么你按照弗兰克告诉你的去做(使用@Around
建议),要么,如果你可以控制调用者以及代码的被调用者部分,你可以这样做(非常丑陋):
@Before("execution(myMethod)")
(可能抛出异常)AfterThrowing("call(myMethod)")
我没有测试过它,但是由于这个控制流它应该可以工作:
[before call]
call(myMethod)
[before execution]
execution(myMethod)
[after execution]
[after call]
即“执行前”已经是“在通话中”。
我想这两个建议是在同一方面?如果没有,您是否声明了定义编织顺序的优先级?
无论如何,如果你想在一个方法之前做某事,然后根据你之前所做的事情做某事,你应该使用一个@Around
建议来代替。您甚至可能不需要异常(代价高昂)来以这种方式控制流程。