« 信じる?信じない? | メイン | 猫の言葉 »
2006年06月01日
C++の例外を使う理由と使わない理由
Effective C++を読んでいると、普通に例外の話が出てくるんだけど、例外ってちゃんと使ったことないなー。 例外ってイマイチ旨味がわからんのよねー。 なので、少し調べてみた。
とりあえず箇条書き。 まずは、ネットで誰かが言ってたり、自分で調べてるうちに気づいた例外の旨味。
- コンストラクタの致命的エラーは例外でないと検出できない
- 例外クラスを派生させることでエラーの分類によるエラー処理ができる
- 深いところからエラーを呼び元に伝えるのが簡単になる
そして逆に、例外を使用しない(ほうが良いと思う)理由。
- コードサイズが大きくなる
- 例外安全なコードを書くのは難しい
- 自分の仕事(家庭用ゲーム機のプログラム)では致命的なエラーはほとんど起きない
よくわかってないので、必ずしも正しいわけではないと思います。鵜呑みにしないでくださいね。
詳しい話はまた今度。
投稿者 sike : 2006年06月01日 01:29
トラックバック
このエントリーのトラックバックURL:
http://ashiato.jp/mt33/mt-tb.cgi/87
コメント
僕も家庭用ゲーム機のプログラムをしていたときは、例外について気にしてませんでしたが、普通のOS上でライブラリを作ってみると、ありがたみがわかるようになりました。
例外を使うか使わないかの判断は、例外を使わなくてもそのソフトウェアが正常な状態では機能するかどうかで、throwするときは「オレ、もうどうにもできんのであとよろしく」とサジを投げるときだとおもいます。そういう状態になるのは外部要因(入力、OSからの割込とか)が原因なので、ゲーム機の場合そんな状態になったらもうアウトだからあんまり使わないんだと思います。
投稿者 ヒロシ : 2006年06月01日 22:08
そうですね。
ゲーム機は致命的なエラーが起きたらもうアウトっていうところが大きいですね。
ただ、それほど致命的なエラーでなくても例外を使う意味があるのかもしれない、と思っています。
あまり沢山の言語を見たわけではないですが、新しく設計された言語やライブラリは例外を好む傾向があるような気がします。
MFCの CFile::Open() の戻り値は成功したかどうかを表わすBOOLで、さらにエラーを受け取るためのオブジェクトをポインタ渡ししてます。
かたや、同じMicrosoftの .NET Framework では、File.Open() はエラー時に例外を投げます。
rubyのライブラリも例外を使ったエラー処理がスタンダードですよね。
ゲーム開発で使うかどうかはさておき、世の中の流れが例外にあるなら、その理由を探ってみようかなーと思ったのでした。
投稿者 sike : 2006年06月02日 02:40