DATE : 2007/06/11 (Mon)
例外の発生原因をスタックトレースから探りたい場合があります。例えば、データベース関係の例外の発生時などです。データベースへの問い合わせで例外が発生した場合、データベースに渡した SQL がおかしかったのか、それともデータベースそのものに障害が発生しているのか、JDBC などのデータベースにアクセスするライブラリ部分の例外なのかなどを判断する必要があります。ところが、Hibernate や Spring Framework などでは、これらの例外は特定の例外オブジェクト内に格納されています。Hibernate の場合、永続化機構(データベースなど)で例外が発生した場合、全て org.hibernate.HibernateException が投げられ、原因(SQL の異常など)はそれに格納されています。
発生した例外の原因は、java.lang.Throwable#getCause() で取り出せます。しかし、これで取り出せるのは1段階下の原因で、2段階以上下のものを取り出すには繰り返し getCause() を呼び出さなければなりません。このようなコードを書くのは非常に面倒です。
そこで、「Jakarta Commons Lang」の org.apache.commons.lang.exception.ExceptionUtils を使います。これは、例外関係に便利なメソッドを集めたユーティリティクラスです。
ExceptionUtils には、例外の原因を探る static メソッドが用意されています。
- indexOfThrowable メソッド
- indexOfType メソッド
これらのメソッドは特定の例外が何段階下のものかを調べるものです。getCause() を順々に呼び出して調べていくイメージです。対象の例外が存在しない場合は-1となります。それぞれのメソッドには、次のような違いがあります。
- indexOfThrowable メソッド
- 指定された例外のクラスのみを対象とし、そのサブクラスは対象としない。
- indexOfType メソッド
- 指定された例外のクラスとそのサブクラスを対象とする。
要するに、サブクラスを対象とするかしないかという違いです。