例外処理について

どのように例外を扱っていくのか?は悩みどころですね。

例えばHello.say()をリモート呼び出しする時を考えると、

  1. rmiregitsryに接続できない場合の例外
    1. そもそもネットワークが確立されていない
    2. rmiregistryが起動していない
    3. URL,ポート番号の不一致
  2. rmiregistryに取得したい参照がない場合の例外
    1. リモートオブジェクト名称の不一致
  3. サーバ側でS2Containerにコンポーネントが登録されていない場合の例外
    1. サーバ側のdicon定義にコンポーネントが未定義
    2. コンポーネント名称の不一致

などが簡単に思いつく。

http://d.hatena.ne.jp/higayasuo/20040608#1086651399を参考にすると、基本的に例外はcatchせず、サービスの呼び出し元に伝播させる。

開発時のことを考えると、実行時例外(RuntimeException)はtry-catchやthrowsを強制しないので、考えなしに開発すると、どのような例外が発生するか意識しなくなってしまう。
※まぁ、try-catchでExceptionのみで処理しても同じですが。

まずは、少なくとも実行時例外を発生させる可能性を持つインターフェースはそれを明示する必要があると思います。

プラグインとかで、対象メッソドが発生させる可能性のある例外(実行時例外)を全て検知するようなのがあると便利そうですね。
※もしかしてEclipseに標準で機能があるのだろうか。

後は、上に簡単に例を書いてはみたけど、実際には

  1. リモート呼び出しの仕組みを準備する時の例外
  2. 実際のリモート呼び出し時の例外

の2種類がある。

サンプルだと準備して、即実行ですが、システムに組み込んだ場合は

  1. システム起動(準備)時
  2. サービス開始時

に明確に段階が分かれるので、例外を扱うポリシーが変わってきそうですね。