Java

例外チェーン機能

ドキュメントの目次

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 に追加して) この新機能をサポートするよう更新される予定です。

この変更に対応するバグ追跡レポートは、4209652 です。


Copyright © 2002 Sun Microsystems, Inc. All Rights Reserved.

Sun
Java ソフトウェア