例外チェーン機能

Javaコードが、ある例外をキャッチして別の例外をスローするのは一般的なことです。

try {
    ...
} catch(YourException e) {
    throw new MyException();
}

ところが「原因となった例外」(上の例ではYourException)に含まれる情報は通常失われてしまうため、デバッグが非常に複雑になります。この問題を認識した開発者が、「ラップされた例外」に2つめの例外を含めることができる臨時のメカニズムを構築することがあります。一般に、含まれる例外を取り出すためにアクセサが用意されています。こうしたメカニズムは、含まれる例外自体がラップされた例外であるときに例外チェーンを任意に構築できるため、「例外チェーン機能」と呼ばれることがあります。

これらの機能すべてを統合することには多くの利点があります。主な利点は次のとおりです。(1)例外の種類にかかわらず、ある例外が別の例外を発生させた事実を記録したい人がそのようにできることを保証します。(2)ある例外が別の例外を発生させた事実を記録するための共通APIを提供することで、このタスクが容易になり、プログラマが手軽に記録しやすくなります。(3)原因となった例外にアクセスするための共通APIを提供することで、この情報を必要とする人が情報を利用できる可能性が大幅に高まります。実際、提案されているメカニズムは、「原因のチェーン」全体を標準スタック・バックトレースの一部として出力するので、作成者が追加作業を行わなくても既存のプログラムからこの情報が提供されます。

これらの課題に対処するために、getCause()およびinitCause(Throwable)という2つのメソッドと、Throwable(Throwable)およびThrowable(String, Throwable)という2つのコンストラクタを、Throwableに追加しました。その他の「汎用」例外クラス(ExceptionRunTimeExceptionErrorなど)にも同様に、(Throwable)および(String, Throwable)コンストラクタが装備されました。ただし、このようなコンストラクタをもたない例外でもinitCauseメソッドを使用すれば「ラップされた例外」として使用できます。

Throwable.printStackTraceの実装は、例外の因果関係チェーン全体のバックトレースを表示するように変更されています。新しいメソッドgetStackTraceは、printStackTraceによって提供されるスタック・トレース情報へのプログラム・アクセスを提供します。

プラットフォームのすべてのラップされた例外が、この新機能(およびそれらのレガシーAPI)をサポートするように改良される予定です。


Copyright © 1993, 2020, Oracle and/or its affiliates. All rights reserved.