flat7th

memo/20080604

created 2008-06-04 modified 2008-06-04 

参考になるページを見つけたのでメモ。

リンク備考
http://www.noppi.jp/diary/?date=20050906

ほほう、コンストラクタですら例外を使いたくないと。なるほど。
コンストラクションの成否を別メソッドで通知可能にすると。ほほう。

私もC++では例外は、プロセスが自決するときにしか使いたくないと思っておりました。
C++では例外を使うと、4~6%遅くなるという情報があります(リップマン C++オブジェクトモデル)。

リソースの確保はコンストラクタで行うのが正論(と、ストラウストラップ氏が言ってたらしい。ソースは確か岩谷氏?が訳したC++の発展経緯の本だったような)。
だから、「コンストラクタでは何もせず、実質初期化を行う別メソッドを作る」のは好きじゃない。

で、参照先の意見(記述)を自分なりにこねくり回して解釈してみると、
コンストラクタ失敗は例外を返すのが「言語仕様」であり「普通」だけど、それはコンストラクタで失敗するのが「異常」であるクラスでの話であると。そういうことですな。たぶん。

たとえばネットワーク接続のような、簡単に失敗してしまうリソースを確保するコンストラクタでは、上記参照先のような方法をとるのが賢いのかもしれないですね。

そうすれば、
今までの俺ルール

(1)メモリ確保失敗など、重大な例外は全員スルーパスして、ctr0でのデフォルトキャッチャーに任せる。
(2)そんでプロセス自身は異常終了し、監視ツールで拾う。
(3)軽微な理由でコンストラクタが失敗するクラスの場合、呼び側はコンストラクションにtry~catchをかます。

を、こう変更できます。

(3'-1)軽微な理由でコンストラクタが失敗するクラスの場合、軽微な理由で失敗しても例外は返さない。
(3'-2)そのかわりに成否を知るためのメソッドを用意する。呼び側はコンストラクション後に適切にチェック。



(補足)テストでは規定ハードにて最大データ(最大負荷)を試すから、実運用でメモリ不足が起こることは基本的にありえない。

です。