« ビルド処理の進捗状況表示 | トップページ | TableViewerを使った表コンポーネントの利用 »

2004.04.09

マルチ・ステータス

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);

ある処理が別の複数の処理を呼び出す場合などで,複数のエラーを同時に呼び出し元に通知したい場合などは,マルチ・ステータスの使用は非常に有効である。

|

« ビルド処理の進捗状況表示 | トップページ | TableViewerを使った表コンポーネントの利用 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/12631/416040

この記事へのトラックバック一覧です: マルチ・ステータス:

« ビルド処理の進捗状況表示 | トップページ | TableViewerを使った表コンポーネントの利用 »