ContextedRuntimeException

Commons Lang3のクラスで、マップ形式で例外発生時の情報を保持できるRuntimeExceptionの派生クラス。

執筆時バージョン
Java

Java SE 8

commons-lang

3.2

基本的な使い方

ContextedRuntimeExceptionを使うことで、簡単に例外発生時の情報を保持することができる。

ContextedRuntimeExceptionの使用例
int employId = 1;
String name = "Taro";
int baseSalary = 300000;

try {
    // 何らかの処理
} catch (Exception e) {
    throw new ContextedRuntimeException("給与計算中に例外が発生。", e)
        .addContextValue("従業員ID", employId)
        .addContextValue("名前", name)
        .addContextValue("基本給", baseSalary);
}
出力
org.apache.commons.lang3.exception.ContextedRuntimeException: 給与計算中に例外が発生。
Exception Context:
  [1:従業員ID=1]
  [2:名前=Taro]
  [3:基本給=300000]
---------------------------------
  at com.javazuki.sample.commons.exception.ContextedExceptionTest.test(ContextedExceptionTest.java:36)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  ... more

このようにラベルと値のペアを簡単に追加できるので、idなどの原因究明に必要な変数の値を追加しておけば原因追及がグッと楽になる。一方RuntimeExceptionでは、1つのメッセージしか受け取ることができない。

副作用もないので現在RuntimeExceptionを使っているところをContextedRuntimeExceptionに変えるだけで、この機能を簡単に利用できる。独自例外を作る場合もお勧め。

Appendix B: 改訂履歴

  • v1.0 ,2013-12-05: 初稿