例外の悪い点は何故かcatchしなくてもコンパイルできることである。
catchしてない例外が起きると当然プログラムが落ちるかOSが例外表示を出す。
まだ、行き先が一意に決まるGOTOの方がマシである。
例外を投げることは、致命的欠陥の原因をプログラムに埋め込むのと同義である。
例外でネストの深いところから一気に抜けたとしても、適切に復帰やロールバック処理をしないと安全は保証されない。
深いネストが必要な大規模なプログラムを例外を使ってバグ無く組む自信は無い。
それをやるくらいなら、1段ずつ適切にreturnした方がマシだと思う。
たとえ以下のように...で受けても何も問題は解決しない。
//パターン1
catch(...){ //honyarara }
//パターン2
catch(CException e)
{ //CExceptionはMFCの例外
e-Delete();
}
例外で投げられたものがオブジェクトの場合、解放処理が必要な場合があるからである。
MFCの例外はDeleteを呼んで消さないとメモリリークするので...で受けてはいけない。
それにパターン2はバグっていて、例外をキャッチできない。
catch(CException *e){e-Delete();}
正解はこのようにポインタで宣言しなければならない。
これもコンパイルエラーにもならないのでcatch漏れの原因になる。
実体もポインタもthrowできる所為でこんな間違いが起きるのである。
まとめ
C#みたいにusing出来ればメモリリークは防げそうだが無論出来ない。
例外は割り込みなので、手続き型言語と相性が悪いと思う。
例外を複数種類投げるのは非生産的である。
エラーの種類を知りたいならエラーコードでも返せばいいだけだ。
例外の種類だけcatch文を並べるくらい馬鹿らしいことはない。