マルチ・ステータス
Eclipseのプラットフォームや各種プラグイン内で発生したエラーは,エラーの内容をIStatusオブジェクトに格納し,それを持つCoreException例外のスローによって表現する。「CoreExceptionとIStatus」では,あるひとつのエラーに対してのIStatusオブジェクトの作成とCoreException例外のスローについて解説したが,実際には複数のエラーが同時に生じる場合もあり,CoreException例外は複数のエラーの情報を持つことができなければならない。
例えば,プロジェクトが2つ以上のビルダーを持っていた場合,ビルダーの実行中に複数のビルダーで処理に失敗する可能性がある。ビルダーの実行はエラーが生じたかどうかに関わらず全てのビルダーが実行されるため,当然エラーの個数も複数となる。つまり,エラーの内容を持つIStatusオブジェクトが複数生成されるということである。
複数のエラーが生じたことを表現するために,IStatusインタフェースは複数の子IStatusオブジェクトを扱えるように規定されている。複数のステータスのことをマルチ・ステータスと呼ぶ。IStatusインタフェースによるマルチ・ステータスに関する処理の規定は以下のものがある。
public boolean isMultiStatus() - マルチ・ステータスかどうか
public IStatus[] getChildren() - 子のステータスの配列
CoreException例外オブジェクトのgetStatusメソッドで取得したIStatusオブジェクトに対して,isMultiStatusメソッドを使用することにより,マルチ・ステータスかどうかを判断することができる。もしisMultiStatusメソッドの結果がtrueだった場合は,getChildrenメソッドを用いて子ステータスの配列を取得し,それぞれに対して処理を行う(個別にログに出力するなど)。
try {
...
} catch(CoreException e) {
Plugin plugin = ...;
IStatus status = e.getStatus();
plugin.getLog().log(status);
if (status.isMultiStatus()) {
IStatus[] children = status.getChildren();
for (int i = 0; i < children.length; i++) {
plugin.getLog().log(children[i]);
}
}
isMultiStatusメソッドは,子のステータスが1つ以上あるかどうか,というメソッドではないことに注意。あくまでIStatusオブジェクトがマルチ・ステータスなのかどうかを判断するために使用する。これは,単独のステータスの実装クラスがStatusクラスなのに対して,マルチ・ステータスの場合の実装クラスがMultiStatusクラスであることに起因する。isMultiStatusメソッドの戻り値はStatusクラスであれば常にfalse,MultiStatusクラスであれば常にtrueである。
ビルダーの起動において,ビルド処理中にエラーが発生した場合,CoreException例外が捕捉される。この場合はIStatusオブジェクトはマルチ・ステータスなので,getChildrenメソッドを使って発生したエラーの数だけIStatusオブジェクトを取得することができる。
自分でマルチ・ステータスなIStatusオブジェクトを生成する際には,以下のような感じで行えばよい。
String pluginId = ...;
int code = ...;
String message = ...;
Throwable cause = ...;
IStatus status1 = new Status(...);
IStatus status2 = new Status(...);
IStatus multiStatus = new MultiStatus(
pluginId, code,
new IStatus[]{status1, status2},
message, cause);
throw new CoreException(multiStatus);
ある処理が別の複数の処理を呼び出す場合などで,複数のエラーを同時に呼び出し元に通知したい場合などは,マルチ・ステータスの使用は非常に有効である。
| 固定リンク
この記事へのコメントは終了しました。
コメント