例外処理

33にもなってこれでいいのかと思うが,いまだにJavaの例外に関する設計の原則がわかってない. たとえば,

  1. 何を例外処理として,何は通常の処理として扱うべきか:絶対に事後条件を満たせないことがわかった時点で,すべて例外処理として投げる.*1当たり前と言われそうだが,ポイントは事後条件が何かを決めないと絶対に例外は網羅できないと言うこと.いくら,書いた正常系の処理とにらめっこして,関係ありそうな例外を考えても網羅されることは決してない.
  2. 上がってきた例外で,どれは補足すべきか,どれは上に投げるべきか:上と同じで,自分のメソッドの事後条件が満たせるように解決できるなら補足,ダメなら,どのような形式で投げるかはは別として投げる.
  3. 自身で作る例外のクラス階層をどのような決まりで設計すべきか:これは深い.ただ,闇雲にサブクラスを作る方式と,クラスの中の属性として,詳細をあらわすTypeSafeEnumのようなクラスを持つかどっちか.悩み中
  4. 上がってきた例外を上に上げるとき,そのまま投げるか,包むべきか:包まざる得ないのは相手が受け取れるExceptionのサブクラスが決められているもの.フレームワークなどにありがち.これも一般論がわかってない.
  5. RunTimeExceptionとExceptionの違いをどう使い分けるべきか:いろんな説明があり,「RuntimeException」は実行してみなくてはわからないもの,とかプログラムで直すことが可能な例外である,とか書かれているが,これ!ってのがないなあ. 考えよっと.

適当に書きすぎたが,まあ,
おおよそは自分で決めているが,まだあいまい.自分での決めはあとで書く.
Java魂―プログラミングを極める匠の技
Java魂:結構当たり前の内容が多いが,自分の知識整理にはいいかも.ちなみに訳がひどい*2ので,ときどき直訳したと想像して英語に逆変換して正しい日本語に戻さないと意味がわからない. こういう本って日本語のを買ったら,英語のPDFを自由に参照できるようにしてくれないだろうか.

*1:事前条件が満たされていないときは,RuntimeExceptionを吐くのかな

*2:さっき読んでいたところで例をあげると,Object.equals()の説明で「反射的」と訳すべき'reflective'が,「再帰的」と訳されまったく意味が通らない.