Java Tips | 実務ユーティリティ:Throwableチェーン取得

Java Java
スポンサーリンク
スポンサーリンク

なぜ「Throwableチェーン取得ユーティリティ」が業務で重要になるのか

業務システムで例外を扱っていると、「このエラーはどこから来たのか」「途中でどんな例外がラップされているのか」を知りたくなる場面が必ず出てきます。 Java の例外は、ThrowablegetCause() を使って「原因となった例外」をたどれるようになっており、これが Throwableチェーン(例外の連鎖)です。

例えば、次のような流れがよくあります。

  • DBアクセスで SQLException が発生する
  • それをアプリケーション層で DataAccessException にラップして投げ直す
  • さらにサービス層で BusinessException にラップして投げ直す

このとき、「最終的に捕まえた例外」だけを見るのではなく、 途中のすべての例外を一覧として把握する ことで、 どこで何が起きたのかをより正確に理解できます。

そこで役に立つのが「Throwableチェーン取得ユーティリティ」です。 Throwable から getCause() をたどり、チェーン全体を安全に・分かりやすく扱えるようにすることで、 ログ出力・障害解析・監査・セキュリティ調査などに大きく貢献します。

ここから、プログラミング初心者向けにステップバイステップで考えながら、 実務で使える Throwableチェーン取得ユーティリティを丁寧に解説していきます。

ステップ1 Throwableチェーンのイメージをつかむ

「例外がバトンリレーしている」イメージです

まず、Throwableチェーンがどういうものかをイメージで押さえておきます。

次のようなコードを考えます。

public class ThrowableChainExample {

    public static void main(String[] args) {
        try {
            service();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    static void service() {
        try {
            repository();
        } catch (Exception e) {
            throw new RuntimeException("サービス層でエラー", e);
        }
    }

    static void repository() {
        throw new IllegalArgumentException("IDが不正です");
    }
}
Java

このプログラムを実行すると、スタックトレースは次のようなイメージになります。

java.lang.RuntimeException: サービス層でエラー
    at ThrowableChainExample.service(ThrowableChainExample.java:...)
    ...
Caused by: java.lang.IllegalArgumentException: IDが不正です
    at ThrowableChainExample.repository(ThrowableChainExample.java:...)
    ...

ここで、

  • 一番外側が RuntimeException(サービス層)
  • その原因(Caused by)が IllegalArgumentException(リポジトリ層)

という「例外のバトンリレー」が起きています。 この「外側から内側へ」「表面から根っこへ」の連鎖が Throwableチェーン です。

ステップ2 なぜチェーン全体を取得したくなるのか

「どこでラップされたか」「どこが本当の原因か」を知るためです

業務システムでは、例外をラップして投げ直すことがよくあります。 その理由は、次のようなものです。

  • 下位層の技術的な例外(SQLException など)を、上位層の業務的な例外(BusinessException など)に変換したい
  • 呼び出し元に「どの処理でエラーになったか」を分かりやすく伝えたい
  • フレームワークの例外をアプリケーション独自の例外に包みたい

このとき、最終的に捕まえた例外だけを見ると、 「サービス層でエラー」「業務処理でエラー」といった表面的な情報しか分からないことがあります。

一方で、チェーン全体を取得すると、

  • どの層でどの例外が発生したか
  • どのタイミングでラップされたか
  • 一番深いところで何が原因だったか

を一覧として把握できるようになります。

これが、Throwableチェーン取得ユーティリティが業務で役に立つ理由です。

タイトルとURLをコピーしました