例外チェーン機能

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, 2013, Oracle and/or its affiliates. All rights reserved.