« なぜcreateExecutableExtensionを用いるべきか? | トップページ | PDE JUnit Pluginのインストール »

2004.01.30

拡張ポイント呼び出し時の例外対処

あるプラグインが自前で用意している拡張ポイント。拡張ポイントの自作(1)および拡張ポイントの自作(2)で解説した拡張ポイントの自作方法において,各プラグインにより提供されたクラスのメソッド呼び出しに対して,例外処理は何も行っていなかった。

例えば,あるIObserverインタフェースの実装クラスが以下のようなものだったとき,

  public BadObserver implements IObserver {
    public void update() {
      throw new NullPointerException();
    }
  }

実行時例外の発生により,一連の拡張ポイントへのメソッド呼び出しが途中で停止してしまう。拡張ポイントの定義側では,拡張ポイントの利用側がどんなコードを記述するのか想像できない(想像してはいけない)ので,(Errorはほっとくにしても)実行時例外を含む例外の発生について安全性を確保しておく必要がある。

  public void notify() {
    Iterator i = observers.iterator();
    while(i.hasNext()) {
      IObserver observer = (IObserver)i.next();
      observer.update(); ← (実行時)例外への対処が必要!
    }
  }

そこで,Eclipseでは上記のような例外処理を補佐するためのISafeRunnableインタフェースが提供されている。行いたい処理とそれについての例外処理をカプセル化することを目的としている。ISafeRunnableインタフェースの実装オブジェクトは,Platformクラスのrunメソッドにより実行することができる。このインタフェースを用いると,上記のコードは以下のように書き換えることができる。

  public void nofity() {
    final Iterator i = observers.iterator();
    while(i.hasNext()) {
      final IObserver observer = (IObserver)i.next();
      ISafeRunnable runnable = new ISafeRunnable() {
        public void run() throws Exception {
          observer.update();
        }
        public void handleException(Throwable exception) {
          exception.printStackTrace();
          observers.remove();
        }
      }
      Platform.run(runnable);
    }
  }

実行したい処理をrunメソッド内に記述する。このrunメソッドで何らかの例外が発生したときには,自動的にhandleExceptionメソッドが呼び出され,発生した例外が渡される。そして,handleExceptionメソッド内で,適切な例外処理を行うのである。これにより,IObserverオブジェクト1つに対して正常処理と例外処理がカプセル化され,他のIObserverオブジェクトの実行に影響が及ぶことはなくなる。ちなみに上記のコードでは,例外が発生したIObserverオブジェクトをコレクションから除外している。

ISafeRunnbaleインタフェースのデフォルト実装として,handleExceptionメソッドにエラーダイアログの表示処理が記述されたSafeRunnableクラスも用意されている。しかし,これは固定的なメッセージしか表示できないので,あまりお勧めできないかな。それにしても,IBMってほんと「handleException」好きだな。。。

|

« なぜcreateExecutableExtensionを用いるべきか? | トップページ | PDE JUnit Pluginのインストール »

コメント

コメントを書く



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




トラックバック

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

この記事へのトラックバック一覧です: 拡張ポイント呼び出し時の例外対処:

« なぜcreateExecutableExtensionを用いるべきか? | トップページ | PDE JUnit Pluginのインストール »