« プロパティ・ページの作成方法 | トップページ | エラーダイアログの表示 »

2004.03.25

CoreExceptionとIStatus

EclipseプラットフォームのAPIを見ていると,いたるところで出てくるのがCoreException例外クラス。プラグインを開発していると,頻繁に,try { ... } catch(CoreException e) { ... } している自分がそこにいる。

一般的に,Javaでは例外クラスの考え方は大きく2つに分けられる。

一つは,正常系の処理から外れた状況の数だけ例外クラスをどんどん作る考え方。その状況がある程度グループ化されるのであれば,そのグループとなる親クラスを作って,具体的なエラー状況ごとにサブクラスを作成する。例えば,入出力関係の例外というグループ的な意味でIOException例外クラスがあり,その具体的な状況(ファイルが見つからない,など)の表現として,IOException例外クラスを継承したFileNotFoundException例外クラスがある,という感じである。どんなエラーなのかは,キャッチする例外の種別で判断する。

もう一つは,SQLException例外クラスのようなものもある。データベースに関するエラーとしてSQLException例外クラス一つしかなく,具体的なエラーの状況はgetErrorCodeメソッドの戻り値で判断する,という感じのものである。

Eclipseプラットフォームでは,後者の考え方が取り入れられている。つまり,Eclipse内での例外は,ほとんどの場合CoreException例外クラス一つでまかなわれている。では,どんな事態になってCoreException例外がおきたのかということを判断するにはどうしたらいいかというと,CoreException例外クラスが持つIStatusオブジェクトの中身を見てどんなエラーなのかどうかを判断するようになっている。CoreException例外クラスは,IStatusオブジェクトを例外発生元から例外処理側に運ぶためのコンテナと考えることができる。その証拠に,CoreException例外オブジェクトの生成には,必ずIStatusオブジェクトが必要である。

IStatusインタフェースでは,いくつかの情報を提供する処理が規定されている。CoreException例外に格納する目的で使用される場合,IStatusオブジェクトが持つ情報は以下のものになる。

  ・エラーが発生したプラグインのID (必須)
  ・エラーコード (必須)
  ・対人間用のメッセージ (必須)
  ・エラーレベル (必須)
  ・エラーの原因となった例外オブジェクト (任意)

エラーレベルは,IStatusインタフェースに定義されている以下の定数から選択する。

  ・IStatus.INFO - 情報
  ・IStatus.WARNING - 警告
  ・IStatus.ERROR - エラー

自分でCoreException例外をスローするときは,IStatusインタフェースの実装クラスを自作する必要は通常なく,プラットフォームが提供してくれているStatusクラスを使えばよい。以下に,CoreException例外を自分でスローする場合の例を示す。

  int ERROR_CODE_FILE_NOT_FOUND = 35;

  public void lodaFile(String fileName) throws CoreException {
    try {
      ...
    } catch(FileNotFoundException exception) {
      Plugin plugin = ...;
      String pluginId = plugin.getDescriptor().getUniqueIdentifier();
      IStatus status = new Status(
        IStatus.ERROR,
        pluginId,
        ERROR_CODE_FILE_NOT_FOUND,
        "File not found. " + fileName,
        exception);
      throw new CoreException(status);
    }
  }

上記では,ファイルを読み込む処理がFileNotFoundException例外の発生によって失敗したときにCoreException例外をスローする,という例である。PluginクラスのgetDescriptorメソッドでIPluginDescriptorオブジェクトを取得し,そのgetUniqueIdentifierメソッドを呼び出すことによって,プラグインのIDを取得できる。あとは,Statusクラスのコンストラクタに各種情報を渡してIStatusオブジェクトを生成し,CoreException例外クラスのコンストラクタにIStatusオブジェクトを渡して,できあがったCoreExceptionオブジェクトをスローしている。

ところで,IStatusインタフェースでは,IStatus.OKという定数も定義されているのだが,上記の説明ではIStatus.OKの存在に違和感を感じてしまうかもしれない。CoreException例外に格納されるという前提でステータスコードを考えてしまうとIStatus.OKは浮いてしまうのだが,IStatusオブジェクトは「ある状況」を汎用的に表現することを目的としたものであり,それはエラーという状況のみに限定されない,ということである。

さて,CoreException例外をキャッチする側はどうするのかというと,普通はエラーダイアログを表示したり,ログにエラーを書き出すことになる。

|

« プロパティ・ページの作成方法 | トップページ | エラーダイアログの表示 »

コメント

コメントを書く



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




トラックバック

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

この記事へのトラックバック一覧です: CoreExceptionとIStatus:

« プロパティ・ページの作成方法 | トップページ | エラーダイアログの表示 »