JavaWorld9月号の記事で「例外設計の要諦をつかむ」という記事がある。
迷わず買いです。
- 例外の基本
- ユーザー定義例外の設計原則
- EJBにおける例外処理
という構成だが、どれも面白い。
特に面白いというか、役に立つのが「EJBにおける例外処理」である。
実際、ここ1ヶ月EJBのXAExceptionに悩まされおりEJBの例外発生時のコンテナの振る舞いについて勉強が足りないなーと感じていた矢先の記事だったので飛びついてしまった。
具体的には、EJBにおけるアプリケーション例外、システム例外発生時にクライアントはどのように対処すべきか、そしてコンテナはどのようにトランザクションを処理するかが書かれている。
多少、日本語がわかりづらいが非常に役に立った。
ただ、ユーザー定義例外の設計原則においてRuntimeExceptionを継承してExceptionを作るべきではないという部分には、若干疑問が残る。
例えば記事の中では、FileNotFoundExceptionにはIOExceptionがあるように上位クラスではスーパークラスでキャストしてカテゴリーごとに対処すべきだと言っている。
しかし、現実的じゃないような気がする。
例えばSQLExceptionって、ロックタイムアウトや重複時の例外以外ってRDBのエラーだったりするわけである。つまり回復なんぞおお無理なわけだから、通常の例外にされると他のクラス設計によからぬ影響を残す気がする。
だもんで、Model部分でキャッチしてログを出した後にRuntimeExceptionでthrowしてしまうほうが良いのではないだろうか?という事である。
ただ、この辺が不勉強なところで、EJBコンテナにおいてはどうもRuntimeExceptionしたときの振る舞いが判然としない。
-------
ちなみに、DB2でXA利用時にLocktimeOutのSQLExceptionが出ると、キャッチして握りつぶしてもXAResourceがXA_RBDEADLOCKによってendできないのは仕様なのだろうか?DBにはちゃんと反映されているんだけどなー。
そもそもLocktimeOutが発生した時点で、だめってことなのかな?