コンストラクタでの例外はあり?なし?

27
普通のC++使い、銀天すばる @SubaruG

僕らみたいな const 狂にとってはコンストラクタで初期化は全て終了してくれないと困る。

2010-09-29 11:49:03
なぎせ ゆうき @nagise

newのタイミングでリソースがどうにもならないのが分かってて、そこで例外を出さないとしたら、実際にリソースの使用がされるメソッドまで例外を遅延させることになるんじゃないの?問題箇所と例外発生箇所が離れる方が害が大きいと思うんだけどな

2010-09-29 11:49:33
Kazunori Otani @katzchang

@nagise リソースの確保はnewさせずに引き渡すべき、でいいのでは?

2010-09-29 11:50:35
なぎせ ゆうき @nagise

この件だと、コンストラクタが例外を投げることが問題なのではなくてtry-catch節スコープが分かれること型推論の複合が問題の根源なんじゃないの @bleis http://d.hatena.ne.jp/yaneurao/20100929 話の元ネタ

2010-09-29 11:52:26
普通のC++使い、銀天すばる @SubaruG

コンストラクタで投げられる事を禁止されると、コンストラクタで可能なことが大きく制限されて、非常に困るのですよ。 や、もちろん、例外は(メモリ不足などの滅多に起きない物は例外としても)事前のチェックで回避できるべきですが。

2010-09-29 11:52:54
なぎせ ゆうき @nagise

リソースは外部で確保してから渡せってこと? @katzchang @nagise リソースの確保はnewさせずに引き渡すべき、でいいのでは?

2010-09-29 11:53:48
mzp @mzp

ボクだったらloan patternで書きます.スコープうんぬをおいといても,いちいちtry...catchとか書くのが面倒 RT @bleis: http://d.hatena.ne.jp/yaneurao/20100929 話の元ネタ

2010-09-29 11:54:53
普通のC++使い、銀天すばる @SubaruG

僕みたいな const 狂 && 例外安全教の人間は、別に少数派ってわけでもないはずなんだけどにゃー。

2010-09-29 11:55:06
Kazunori Otani @katzchang

@nagise そう。DIパターン。もしくはファクトリー。

2010-09-29 11:55:31
otf @otf

C#のThreadクラスとかコンストラクタを呼んだ後にリソースを確保する奴よりboostのthreadみたいなコンストラクタでリソース確保するやつほうがいいように思えるなぁ コンストラクタ(生成関数)だけほかの関数と仲間外れってどうかと思うし

2010-09-29 11:55:44
ちゃっぴ @tyappi

GC 使っている言語でなんで condtructor で例外はいたらいけないのか分からない。そんな特殊な言語体系あるんかいな? *MZ3*

2010-09-29 11:55:51
ぐるぐる系SQL @bleis

@nakanishiyasuo なのでやっぱりGCある言語でリソースを内部で(ry なクラスのコンストラクタは例外投げるべきじゃない、と

2010-09-29 11:55:54
Shinji Kono @shinji_kono

@nagise 継承自体をあまり使ってないとそんな風に思うかも。コンストラクタでゴチャゴチャやられると、拡張できなくなる。特にデフォルトでやられると死ねます。初期化は別メソッドが良いね。まぁ、それを理由に継承使うなって言う人も多いのだが。

2010-09-29 11:56:04
mzp @mzp

だって怖くね?うっかりtry catchを書き忘れたらリソースリークするんだよ.あとtry catchを書かなくてもコンパイル通るし,たいていの場合はちゃんと動いちゃうんだよ

2010-09-29 11:56:24
普通のC++使い、銀天すばる @SubaruG

例外安全教: 例外安全の基本的な(あるいは最小限の)保証を満たすためなら、多少のコスト増を厭わない人間のこと。強い保証をすべての操作に要求する人は例外安全狂。

2010-09-29 11:56:31
普通のC++使い、銀天すばる @SubaruG

ここでいうコストは実装コストと実行時コストの両面ですにゃ。

2010-09-29 11:57:03
ぐるぐる系SQL @bleis

@nagise そもそもtry-catch使わなければいけないというのが駄目だと思っているのでもしtry(なんとか) { ... とかかけたとしてもそれを強制できないので使いたくないですね

2010-09-29 11:58:08
普通のC++使い、銀天すばる @SubaruG

思う。 RT @otf: C#のThreadクラスとかコンストラクタを呼んだ後にリソースを確保する奴よりboostのthreadみたいなコンストラクタでリソース確保するやつほうがいいように思えるなぁ コンストラクタ(生成関数)だけほかの関数と仲間外れってどうかと思うし

2010-09-29 11:58:46
なかわんくま/nakawankuma/ @nakawankuma

@bleis catch書いたら負け(APIとか下回りのぞくのぞく) =>今週末は福岡 http://j.mp/d08WKi

2010-09-29 11:59:18
普通のC++使い、銀天すばる @SubaruG

っていうか、C++の場合は、コンパイラによって自動定義されたデストラクタを使い、かつ placement new とかを行わない限り、コンストラクタで例外が投げられてもリークは起きない。

2010-09-29 12:00:46
ぐるぐる系SQL @bleis

@otf 「生成」関数という他の関数とは違う性質があるので、言語によってリソース確保をどこでやるかが変わるのは当然かな、と。まぁコンストラクタでリソース確保をやらない方がいい言語を批判するならわかりますが

2010-09-29 12:00:47
普通のC++使い、銀天すばる @SubaruG

placement new とかを使う場合は、分かってて使うわけだし?

2010-09-29 12:01:25
普通のC++使い、銀天すばる @SubaruG

参考: 本物の C++er はデストラクタを書かない: http://bit.ly/9tFtRZ

2010-09-29 12:02:17