例外をスローする@BeforeAdviceを作成し、別の@AfterThrowingでキャッチしようとしましたが、機能しません。
例外がアドバイスではなくメソッドで直接スローされた場合、それは機能します。
アドバイスでスローされた場合、@AfterThrowingは実行されません。
なぜそれがそのように振る舞うのですか?
2つのアドバイスは同じ側面だと思いますか?そうでない場合は、織り順序を定義するための優先順位を宣言しましたか?
とにかく、メソッドの前に何かをしたい場合、および前に行ったことに応じて何かをしたい場合は、@Around
代わりにアドバイスを使用する必要があります。そのようにフローを制御するために、例外(コストがかかる)さえ必要ないかもしれません。
理由:キャプチャされたメソッド内@AfterThrowing
から例外がスローされたイベントをキャッチします。しかし、意味:キャプチャされたメソッドの前(つまり、外部)で何かを実行します。したがって、制御フローは、アドバイスの条件を満たすことができるポイントに到達することはありません。@Before
@AfterThrowing
したがって、フランクがあなたに言ったことを実行するか(@Around
アドバイスを使用)、コードの呼び出し元と呼び出し先の部分を制御できる場合は、これを実行できます(非常に醜い):
@Before("execution(myMethod)")
(おそらく例外をスローします)AfterThrowing("call(myMethod)")
私はそれをテストしていませんが、この制御フローのために動作するはずです:
[before call]
call(myMethod)
[before execution]
execution(myMethod)
[after execution]
[after call]
つまり、「実行前」はすでに「通話中」です。