例外メモ

オブジェクト指向信者はなぜか例外が好きだ。返り値でnullや-1を返す方法より例外を返す方が優れていると考えていることが多い。しかしあまり納得のいく理由がない。

例外がいい理由はだいたい以下の2つに集約される。

(1)異常処理をしないですむ

これはそもそもおかしい。異常処理はするべきだ。但し、異常処理をまとめて行なうなど手を抜いてもいい場合なら、例外を使うことでうまく手を抜くことができると言える。

例えば次のように細かい異常処理ができなくなる。


if(func1() == -1) {
//func1に対する異常処理
}
if(func2() == -1) {
//func2に対する異常処理
}

try {
func1();
func2();
} catch() {
// どちらで出た異常か分からないので
// とりあえず死ぬぐらいしかできない
}

異常処理をしないというのは、つまり正常時だけを記述すればいい。つまり記述がシンプルになる。例えば;


int r = obj1().method1().method2().method3();

ここで各メソッドは成功時はオブジェクトを返す。
異常時は null を返す仕様の場合、このように連結できない。

異常処理をしなくていいのであれば、確かにこういったメリットがある。


(2)異常処理を強制することができる。

コンパイル時点で例外をcatchしてないことを検出できるので
異常処理の記述漏れを防ぐことができる。

これは一理あるが、try〜catch の場合、異常処理を書くべきところでcatchすることを強制できない。つまり、main()でcatchするような意味の無いコードでも通ってしまう。


結局、異常処理が要らなくもないが適当でいい場合に、例外を使うとちょうどよく書ける。


ただまあこの仮定はわりと妥当なのかもしれない。
デバッグ時でもなければ、関数ごとのエラーなど気にする必要ないのかもしれない