Aspectjの@AfterThrowingを使って例外発生時に処理を入れる

spring

前回aspectjのbefore、afterを使ったサンプルソースでは、「@Before、@After」を使って、メソッド前後に処理を織り込む(インジェクション)方法を解説しました。

@AfterThrowingは、メソッド前後に必ず動く、「@Before、@After」と違って、例外発生時のみ動作します。

今回は@AfterThrowingを使って、特定クラスの例外発生時に処理を織り込む(インジェクション)する方法を解説します。

[スポンサーリンク]

目次

  1. 例外発生時に特定の処理を入れる

例外発生時に特定の処理を入れる

@Aspect
@Component
public class AfterThrowingAspect {

	@AfterThrowing(value="execution(* com.example..*.*(..))",
					throwing="ex")
	public void throwingNull(NullPointerException ex) {
		System.out.println("NullPointerExceptionが発生しました。 : " + ex);
	}

	@AfterThrowing(value="execution(* com.example..*.*(..))",
					throwing="ex")
	public void throwingIllegalArg(IllegalArgumentException ex) {
		System.out.println("IllegalArgumentExceptionが発生しました。 : " + ex);
	}
}

解説

「execution」で指定したクラスが例外を発生させた場合に、各メソッドが実行されます。
また、例外の種類によって、どのメソッドを実行させるかも、各メソッドの引数で指定することで決めることが出来ます。

「execution」の記述形式については、こちらを参照して下さい。
executionの記述方法についてまとめました

注意

@AfterThrowingでは、try-catchのように、catch句の中で例外を「握りつぶす」ことが出来ません。@AfterThrowingでは必ず例外はスローされます。
よって、例外をcatch句の中で「握りつぶす」ような処理を行いたい場合は、@AfterThrowingではなく、try-catchを入れて対応するしか手段がありません。

最後に

springMVCの例外処理は、@AfterThrowing以外にもいくつか種類があるので、次回は他の例外処理(ハンドリング)についても記事を書きたいと思います。