例外(Exception)についてのメモ

昔から、バカに刃物、アホに例外、と言うように、例外は使いこなすのにコツが要る。
どういうときに例外を使い(例外を投げるメソッドを実装し)、どういうときに戻り値で返すべきか。原則として、例外は、起こったことだけを検知したい場合に使うほうが良い。例外が起こった原因を絶対に知りたいときに例外を使うのは間違っている。
たとえば、Java の IOException を考えてみる。通常、これはいつ起きるか分からない。なぜなら、入出力に絡んだネイティブな部分で起きるものだからいつ起きるか分からない。かといって、ストリーム系のクラスには read/write 等、たくさんのメソッドがあるので、これらのメソッドがいちいち戻り値としてエラーのフラグを返していては大変だ。それに、IOException が起こってしまえば、プログラムとしてはもはやどうすることもできない。せいぜい、オープン中のファイルがあればそれをクローズしなければならないが、それよりしなければならないことはない。ユーザーにはなにが原因でエラーが起こったのかをメッセージボックスの中に書いて表示したい時もあるかもしれないが、そういう時には IOException の中のエラー情報を表示するのは親切だろう。しかし、そのエラー情報の中身でプログラムの挙動を変える必要があるか?IOException が FileNotFoundException か EOFException であるかを、それを受け取ったプログラムが気にする必要があるか?せいぜいユーザーへのメッセージのためだけだろう。