例外を正しく使えないプログラマ多いね。 その4

952仕様書無しさん:2011/02/06(日) 11:15:49
うわー、キタネェコードだなw
953仕様書無しさん:2011/02/06(日) 11:20:34
ぷぷぷぷぷーーーーーーーーーーーーーーーーーーーーー
ダサっ!!!!!!!!!!!!

デストラクタ使えばいいじゃねえか。お前C++知らんのか
954仕様書無しさん:2011/02/06(日) 11:21:17
言語ごとのローカル仕様もしらんでよく例外語れるねw
955仕様書無しさん:2011/02/06(日) 11:23:06
ノミの脳みそが猿を馬鹿にする図式に笑った
956仕様書無しさん:2011/02/06(日) 11:25:45
>>953
デストラクタはクラス終了時の処理
finallyは関数終了時の処理
この違いぐらい知ってください。
957仕様書無しさん:2011/02/06(日) 11:42:28
>>956
知ってるよ。C++ではfinallyはないからデストラクタで処理するしかないだろう
958仕様書無しさん:2011/02/06(日) 11:44:20
それに例外を搭載したOOでgotoつうのうもどうかね
べたCだったらエラー処理にgotoをばんばん使うけどねえ OOのプライドが
それを許さないだろう。お前の好きな例外でどうにかしろよ
959仕様書無しさん:2011/02/06(日) 11:45:29
>>956はC++にfinallyが無いことをしらなかったようです
960仕様書無しさん:2011/02/06(日) 11:45:58
>>957
デストラクタは関数終了時に呼ばれないんだから
変わりに使うことはできません。

finallyならcatchの時にやればいい。
961仕様書無しさん:2011/02/06(日) 11:48:25
つかC++はOOPしてるとは限らんのだが・・・
962仕様書無しさん:2011/02/06(日) 11:49:37
>>960
致命的エラーならばデストラクタでリソース廃棄して終了しないと
リークしちまうよ。君はOracleに吸収されたjavaをつかっているから
そんなこと考えなくても良いんだろうけどね
963仕様書無しさん:2011/02/06(日) 11:49:39
>>957
例外起きたらそのクラス死んでまうのん?
964仕様書無しさん:2011/02/06(日) 11:50:45
言語では規定されて無いけど、実装されてる。
VC++、BCB、gccの全部でfinallyはあるよ。
965仕様書無しさん:2011/02/06(日) 11:51:00
>>961
OOPしないのならべたCのほうが効率がいいよ
966仕様書無しさん:2011/02/06(日) 11:56:25
OOと例外は直接関係しないのだが...
967仕様書無しさん:2011/02/06(日) 12:02:15
現代的な例外やcall/CCはLISP系だよな
968仕様書無しさん:2011/02/06(日) 12:04:26
>>951 俺は猿でよくわからん。以下の間違いをなぜ間違いなのか
猿の俺にもわかるように説明してください。おねがいします
void some_func(){
  try{//...}
//このキャッチハンドラは間違いだそうだ
  catch(void*){...}
  catch(ArrayErr &){...}
  catch(RangeErr &){...}
  catch(const char *){...}
  catch(void (*pf)(const char*)){...}
}
969仕様書無しさん:2011/02/06(日) 12:06:51
>>964
俺のもっているC++プライマーにもそんなこと全く記述されてない
こまったね第2版だからいかんのかなw
970仕様書無しさん:2011/02/06(日) 12:25:41
>>968
「間違いだそうだ」とか言われても何が間違いなのかわからない
971仕様書無しさん:2011/02/06(日) 12:25:41
単によくある独自拡張なだけだろ。

あとデストラクタ云々は、ファンクタみたいなの使うってことであってんの?
C++あんまり使ってないし、なんかバッドノウハウな気がして自信無い。
972仕様書無しさん:2011/02/06(日) 12:32:49
>>971の一行目は>>969宛て・・・
973仕様書無しさん:2011/02/06(日) 12:37:10
以下、このスレはgotoを正しく使えないプログラマ多いねスレになりました
974仕様書無しさん:2011/02/06(日) 12:38:10
>>968
誰が言ったのよ?
975仕様書無しさん:2011/02/06(日) 12:39:08
>>974
C++プライマー第二版
976仕様書無しさん:2011/02/06(日) 12:39:58
>>956>>960
これはひどい
RAIIって知ってる?
977仕様書無しさん:2011/02/06(日) 12:43:09
978仕様書無しさん:2011/02/06(日) 12:43:10
例外を正しく使うためにはRAIIが必須ってこと?
979仕様書無しさん:2011/02/06(日) 12:44:08
>>974 早く解決してくれよ、このスレの神様、俺猿だからもやもやして
気持ちわるいっす

今MSの昔のマニュアル読んでいたら笑った
キーワード
 try*8
catch*8

*8 Microsoft C/C++バージョン7.0では実装されていません

だって
VC++1.0から実装されたのかな
980仕様書無しさん:2011/02/06(日) 12:44:24
>>975
なら理由書いてるだろw
981仕様書無しさん:2011/02/06(日) 12:47:54
>>980
直訳日本語で意味不明でわからんのよ、神様のあなたにぜひお願いします
982仕様書無しさん:2011/02/06(日) 12:49:19
>>979
どこが笑うとこなん?
983仕様書無しさん:2011/02/06(日) 12:57:34
>>981
俺は神だとか名乗ったことないんだけどな。
それに、パッと見ただけじゃ分からんよ。

間違いってのは、コンパイルが通らないってことでOK?
それとも、コンパイルは通るけど良くない書き方ってこと?
984仕様書無しさん:2011/02/06(日) 12:57:35
>>968
何?唐突に
985仕様書無しさん:2011/02/06(日) 12:59:25
>>983
その質問に答えたとして、
お前は適切なことを言えるのか?

適切ことが何かを知っていれば、
コンパイルが通らないのか良くない書き方なのか
聞くまでもなくわかるだろ?
986仕様書無しさん:2011/02/06(日) 13:04:17
>>968
なんで>>951宛?
987仕様書無しさん:2011/02/06(日) 13:25:31
>>985
そこまで解ってるんだったら
983の代わりに解説してあげれヴぁ?
988仕様書無しさん:2011/02/06(日) 13:26:24
>>983
コンパイルは俺もしてないし未確認だけど
よくない(問題のある)書き方らしいが、その意味が知りたい。
きちんと理解できないと、神のように例外をつかいこなせないじゃない。
だからがんばって猿なりに理解します。よろしくお願いします。
989仕様書無しさん:2011/02/06(日) 13:30:23
>>985という優秀な方が登場しましたが、俺はやっぱり神さまにおねがいしたいです
990仕様書無しさん:2011/02/06(日) 13:34:02
そして予想どおりスレの流れがフルgcでかたまりつつあります
991仕様書無しさん:2011/02/06(日) 13:34:44
これ、throw "プギャーーー!";ってやるとどこでキャッチされるの?
992仕様書無しさん:2011/02/06(日) 13:48:58
>>991
throwする側はどこでキャッチするかを考えてはいけない。
throwする側は異常事態が起きたことを親関数に返すだけ。

throwされた例外はその例外に興味がある人。
つまりその例外を処理したい、処理できる人が
キャッチする。
993仕様書無しさん:2011/02/06(日) 13:55:51
>>992
そゆ意味じゃなくてだな

void some_func(){
  try{
  throw "プギャーー!"
  }
//このキャッチハンドラは間違いだそうだ
  catch(void*){...}
  catch(ArrayErr &){...}
  catch(RangeErr &){...}
  catch(const char *){...}
  catch(void (*pf)(const char*)){...}
}

で、キャッチされる場所は
  catch(void*){...}
  catch(const char *){...}
のどっちよ? どっちでもキャッチできるぞ。
だから、どっちに行くかが曖昧であまりよろしくないキャッチ句なんじゃねーの?
994仕様書無しさん:2011/02/06(日) 14:02:12
先に書いた方に決まってるだろ・・・
995仕様書無しさん:2011/02/06(日) 14:02:31
>>993
void*がExceptionの代わりになるみたいな勘違いしてないか?
(void*)でキャストしないかぎりchar*がvoid*でキャッチされるなんてありえないよ。
996仕様書無しさん:2011/02/06(日) 14:08:00
>>993がヒントを述べていますね
どのポインタ例外も標準変換を適用することで void*と称号するらしいです
プライマー二版の時点では警告を出すべきと書いてありますがおそらく
VS2008とかg++ではでるのかな?
997仕様書無しさん:2011/02/06(日) 14:11:28
ああ、スレ終了までに解決してよかった~
これで尻切れのよいうんこのようにすっきりと終われますね
998仕様書無しさん:2011/02/06(日) 14:12:27
g++だとvoid*ではキャッチされません
http://codepad.org/2CDOQeZ0
999仕様書無しさん:2011/02/06(日) 14:15:05
プライマーによる正解の並びだそうです
void some_func(){
  try{
  throw "プギャーー!"
  }
//このキャッチハンドラは間違いだそうだ
  catch(const char *){...}
  catch(void (*pf)(const char*)){...}
  catch(void*){...}
  catch(ArrayErr &){...}
  catch(RangeErr &){...}
1000仕様書無しさん:2011/02/06(日) 14:17:47
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。