トップページ⇒tech
405コメント110KB

ボボボーボ・ボクは例外処理が嫌いなんだな

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
他人が作ったクラスとかだと例外のキャッチし忘れ多過ぎ
何の例外が飛んでくるかわからないクラスなんて怖くて使えない

そもそも例外処理って大域ジャンプだろ、
そんなもの怖くて使えねーよ
0002デフォルトの名無しさんNGNG
保守age
0003デフォルトの名無しさんNGNG
↓次スレたてろ
0004デフォルトの名無しさんNGNG
>何の例外が飛んでくるかわからないクラスなんて怖くて使えない
取りあえずJavaとC++では対策が既に成されてる。
0005デフォルトの名無しさんNGNG
後だしじゃんけんしたくせにC#はいまだに対策がとられておらず
0006デフォルトの名無しさんNGNG
アホアンチはこなくていいよ。
0007デフォルトの名無しさんNGNG
対策ってどんなの?

Rubyつかってるからわからないけど、なにかあるなら教えて。
0008デフォルトの名無しさんNGNG
>>7
メソッドに何が飛んでくる可能性があるか書いてあるだろが。
0009デフォルトの名無しさんNGNG
>>3
次スレです。
http://pc2.2ch.net/test/read.cgi/tech/1065535118/
0010デフォルトの名無しさんNGNG
C++の例外処理は遅い
0011デフォルトの名無しさんNGNG
>>10
頻繁に呼ぶもんじゃないし、いいんじゃないの。
0012デフォルトの名無しさんNGNG
>>10
例外とはめったに起こらないから例外なんだから遅くてもいいだろ
0013デフォルトの名無しさんNGNG
統合環境使えば可能性のある例外全部教えてくれるけど、
言語自体にも対策方法があるの?
0014デフォルトの名無しさんNGNG
例外が遅いから分岐にしているだけじゃないか?
本来は例外として分類されるべき処理はいくらでもありそうだが
0015デフォルトの名無しさんNGNG
>>14
そんなに速度が要求されるのに例外にされるべき処理って何?
0016デフォルトの名無しさんNGNG
例外処理を使うと処理の流れというか思考の流れが飛ぶので気持ち悪い
0017デフォルトの名無しさんNGNG
正常系と例外系で分けて考えられるから見通しが良くなると思うんだが。
0018デフォルトの名無しさんNGNG
例外の方が重要なのに。おまえらわかってない。
0019デフォルトの名無しさんNGNG
効率重視ならいきなりthrowより
goto先にまずまとめたりしない?
0020デフォルトの名無しさんNGNG
あ、VBのGotoErrorラベルみたいなやつね。
VBっていうと敬遠されるかもしれんけど(w
0021デフォルトの名無しさんNGNG
副作用が主の手続きは返すべき値が無いので、
自然と正常系以外は全て例外扱いになるが。
00221NGNG
>>17
今仕事で修正しているプログラムはただでさえぐちゃぐちゃなのに
例外処理使われていて目も当てられない
その上、キャッチのし忘れも多過ぎ
百戦錬磨の俺でさえ逃げ出したくなる。もう例外キライ

本来、エラー処理の抜けをなくしたりシンプルに扱うための例外処理だった
はずなのに、実際は抜けは多くなるし流れも見えづらい
俺にはGOTO文より極悪に見えて仕方がない
0023デフォルトの名無しさんNGNG
>>20
途中スコープの外れるインスタンスのデストラクタを読んでくれたりかなり高機能ですけどね。
0024デフォルトの名無しさんNGNG
後、例外が構造化できるのがポイント。
VBのそれにはまねできないわけだ。
0025デフォルトの名無しさんNGNG
C++は文法的になんの例外投げるのかとか知ることができないのがつらいね。
一応、メンバ関数の宣言の後ろにthrowをつけれるけど、
あってもなくてもコンパイルできちゃうわけで。
0026デフォルトの名無しさんNGNG
>>25
付けてもVCはthrow() (例外を投げない宣言)以外は未実装警告だして
使えないしね・・。VC7.1のISO仕様残り2%のひとつだ。
0027デフォルトの名無しさんNGNG
C#でゲーム作っててさ、
オブジェクトの終了を通知するための手段として
例外を使ってるんだわさ。
で、例外を受け取った外側の処理でそのオブジェクトへの
参照を外すようにしてる。
こういう使い方ってしないほうがいいのかな・・・?
0028デフォルトの名無しさんNGNG
>>1
>そもそも例外処理って大域ジャンプだろ
例外処理を勘違いしてそんな書き方するやつがいるだけだ
0029デフォルトの名無しさんNGNG
>>25
へーそうなのか、C++はコンパイルとおっちゃうのか
そりゃあわけわからんプログラマが前工程やるとわけわからんくなるわな
0030デフォルトの名無しさんNGNG
>>27
そういう例外の使用法は、よく悪い例として取り上げられています
C#は詳しくないけど、デストラクタってありましたよね?
003127NGNG
>>30
デストラクタはありません。(ファイナライザはありますが…)
C#では基本的にGCがメモリの後処理をしてくれます。

やはり例外を通常処理として用いるのは良くないのですか?
0032デフォルトの名無しさんNGNG
例外人間
0033デフォルトの名無しさんNGNG
>>31
>やはり例外を通常処理として用いるのは良くないのですか?

これは当たり前として。
003427NGNG
>>33
わかりました。bool値を返すように変更します。
0035デフォルトの名無しさんNGNG
じゃあC++でlongjmpの真似事をするにはどうすればいいんだ
0036デフォルトの名無しさんNGNG
実際、何を勘違いしているのか、例外を正常な動作の分岐用フラグのつもりで
使うというやつがいて困ったことがあるなぁ

呼べば、ほとんど確実に例外を投げるという・・・ カンベンしてくれ。
0037デフォルトの名無しさんNGNG
まあ、どこまでが正常処理でどこからが異常処理かと言うのは個人差があるからな。

「ほとんど確実に例外を投げる」と言うのは、ちょっとおかしいと思うけど。
0038デフォルトの名無しさんNGNG
名前が悪いんだよ
例外機構じゃなくて大域脱出機構にでもすればよかったんだよ。
0039デフォルトの名無しさんNGNG
>>13
この世に使っているすべてのプログラマが統合開発環境を使っているとは限らないので
そういうものに頼る手法は却下
0040デフォルトの名無しさんNGNG
例外処理を効率よく処理できるデザインパターンを教えれ。
またはそのサイトや書籍をおしえれ
0041デフォルトの名無しさんNGNG
無い
0042デフォルトの名無しさんNGNG
なんかあるだろ。
例外に特化した本でなくてもいい。
なにかおすすめがいい。
鉄則本や落とし穴本でもいい
0043デフォルトの名無しさんNGNG
そもそも例外機構とOOに関連性はない。
例外処理の手順について理解を深めろ。
0044デフォルトの名無しさんNGNG
ある処理を実行してる最中にその処理の続行が完全に不可能になった時、例外を
生成して開放が必要なオブジェクトを廃棄し処理を停止させてるけどだめ?
0045デフォルトの名無しさんNGNG
ところでJava以外で例外処理なんて使ってる人いるの?
0046デフォルトの名無しさんNGNG
>>40
例外とは関係ないけど,もしかしたら
"NullObject パターン" を挙げると喜ぶ?
0047デフォルトの名無しさんNGNG
あれは例外に適しているものだったのか?
投げるべき例外をしっかりとつかみちゃんと正しく例外が処理されるのか?
0048デフォルトの名無しさんNGNG
例外処理ってsignal(3C)がsigaction(2)でしょ。
Windowsは知らんのだが、言語で処理するのは
あまり好きくなれん
0049デフォルトの名無しさんNGNG
>>48
それは普通割り込みという
0050 NGNG
嫌い「なんだな」 ← なんだこれ
0051デフォルトの名無しさんNGNG
>>50
裸の大将じゃないの?
0052デフォルトの名無しさんNGNG
>>50
一般常識に疎いということはオタクだろ、お前。
0053デフォルトの名無しさんNGNG
ボーボボの喋りに特徴ないとは言え、スレタイのわりに1の本文普通すぎ。
0054デフォルトの名無しさんNGNG
>>52
純粋に若いだけかも。何年前だよ、裸の大将って
0055デフォルトの名無しさんNGNG
>>22
仮に例外処理以外の方法(エラーコードを戻り値で返したりグローバル変数に格納したり)
を採用したところでその環境じゃまともに機能しないだろ。
責任を例外処理に押し付けたところで何も問題は解決しない。

例外を投げるやつはドキュメントに明記しろ。
メソッドをコールする奴はドキュメントを嫁。ただそれだけ。

0056デフォルトの名無しさんNGNG
mainでcatch(...)すれば無問題
0057デフォルトの名無しさんNGNG
結局throwsという実験的機能は失敗に終わったということでFA?
0058デフォルトの名無しさんNGNG
>>55
Javadocならthrows句で宣言した例外クラスを書き出してくれるよ。
>>57
ということにしたいのですね :-)
0059デフォルトの名無しさんNGNG
>>46
喜べるとはいえない。。もしそれが逆ならギャグいわれたってそれだけでは現実には何も進展がない。

Javaの鉄則に、「例外を隠さない」手法として
Vectorにcatchされた例外を詰め込んで最後に吐き出し表示するという技が
あった。
しかし汎用性が感じられなかったなあれは。
既存の数多くの例外クラスにそんな機能が最初から
そなわっていればあんなつかいかたも考慮したのだが・・・。

Throwableクラスのメソッドをどうにかして使えばいいのか・・?
0060デフォルトの名無しさんNGNG
裸の隊商はボーボボよりマイナーになったか。
0061デフォルトの名無しさんNGNG
少なくともJavaに関して言えば例外は非常にうまく機能してるんじゃないの?
逆にC#の例外書かなくてもコンパイル通っちゃうのは不安でいけない。
って書くとまた荒れる元になるかな。
0062デフォルトの名無しさんNGNG
throws Exception相当だからね。
0063デフォルトの名無しさんNGNG
れれれれれれれれれれれれれれ例外!!
ああっ!!出ちゃう!!例外出ちゃいますぅぅぅぅぅぅ!!!!!!!

ということで
----------------------終了-----------------------
0064デフォルトの名無しさんNGNG
まるでお粗末君のれれれのおじさんみたいだ。
0065デフォルトの名無しさんNGNG
>>64
ニャロメとケムンパスはいたと思ったが・・・。
0066デフォルトの名無しさんNGNG
>>18
何言ってんですか?
0067デフォルトの名無しさんNGNG
>>65
おそまつにもいるよ。ほうきをもったやつだろ
0068デフォルトの名無しさんNGNG
>>59
メンバにList<Exception>を持つExceptionサブクラス作ったら?
printStackTrace()とかオーバーライドしといて、あとListへの
Iteratorを返すメソッド追加しとけば、そこそこ便利じゃないかね。

つうか、俺がそういうの使ってる。
0069デフォルトの名無しさんNGNG
Listである必要はないだろ。
ひとつ上への参照さえもてれば連鎖的に保存しておけるんだから。

つうか、MSがそういうの使ってる。
0070デフォルトの名無しさんNGNG
つーかC++って構文無茶苦茶汚いね。
何が
List<Exception>
だよ。
おまえらそれで満足か?
0071デフォルトの名無しさんNGNG
>>70
ええ、その後に数十回同じキャストを繰り返すよりは。
0072デフォルトの名無しさんNGNG
>>70
>List<Exception>
充分、きれいですが。
0073デフォルトの名無しさんNGNG
White Spaceの美しさは半端じゃない
0074デフォルトの名無しさんNGNG
>72
馬鹿やろ
破綻してるだろうが。

List<List<Exception>>

これでもうだめぽ(ゲラ
0075デフォルトの名無しさんNGNG
それ、コンパイルエラー。

List<List<Exception> >

だと思われ。

0076デフォルトの名無しさんNGNG
>>75
だから>>74は破綻しているといっているのではなかろうか。
0077デフォルトの名無しさんNGNG
>>75
ほっとけよ、XXXX房は。
唯一C++のtemplateに勝てる所なんだから。
そっとしておいてやっれって。
0078デフォルトの名無しさんNGNG
例外って本当に有効?
例外の利点でよくでるのがスタック等のオブジェクト
破棄や、コールスタックさかのぼっていけるって言うけど、
オブジェクトの破棄はされても関数呼び出しの効果が
自動的ににロールバックされるわけでもないし。
例外のせいで中途半端なところで関数呼び出しが終わってしまう
可能性を絶えず考慮してコーディングする労力のほうが便利さを
遥かに上回っているようなきがする。

例外的な状況のために全ての関数でとりあえずcatchして
ロールバック処理&再throwを書くのもめんどう。
0079デフォルトの名無しさんNGNG
>78
初歩で陥るとこだ罠
0080デフォルトの名無しさんNGNG
>>78
ルーティングの段階でロールバック。
ロールバックの必要な処理は型やメンバでフィルタリング。
try {
....
} catch (filter &e) {
rollback();
thorw;
}
0081デフォルトの名無しさんNGNG
>>78
お前のコードの中にfinallyってあるか?
無ければ独習シリーズでも読み直して出直せ。
0082デフォルトの名無しさんNGNG
つーか例外めんどくせい。俺のコードには
try {
 foo();
} catch(...) {
//何もなし
}
というコードばっかりだよ。

いっそのことこう書こうかなw
try { foo(); } catch(...){}
0083デフォルトの名無しさんNGNG
>>82の書くプログラムは正直使いたくないと思いました。
0084デフォルトの名無しさんNGNG
だっていちいち例外かけって言われるからこうするしか無いじゃん。
0085デフォルトの名無しさんNGNG
だいたい、雑誌とかもこんな風に書いてるしな。
0086デフォルトの名無しさんNGNG
>>78
>自動的ににロールバックされるわけでもないし。

されたら迷惑
0087デフォルトの名無しさんNGNG
>>82
スタックトレース位吐けやボケ。
0088デフォルトの名無しさんNGNG
>>87
禿道。例外発生したらスタックトレース。
決り文句。常にこう書くべし↓

try {
  foo();
} catch (Exception e) {
  e.printStackTrace();
}

例外発生時にも処理が続行されるがキニシナイ
0089デフォルトの名無しさんNGNG
>>87がスタートレックにみえた_| ̄|○
0090デフォルトの名無しさんNGNG
>>82
くたばれ
0091デフォルトの名無しさんNGNG
>>81
finallyなんてねえよ。あったらコンパイルとおらんし(w

>>86
>されたら迷惑
もちろんめいわくだ。何が正しいロールバックかなんて
機械的に決定されるものでもないと思うし。例外が自動で
やってくれることはたかが知れているじゃないかって意見。

本当に末端のライブラリが投げるんならまだ良いんだけど、
アプリケーション製作者が気軽に投げるもんでも無い気が
する。
0092デフォルトの名無しさんNGNG
Java厨は氏んでいいよ。
0093デフォルトの名無しさんNGNG
漢なら確固たる信念を持って例外処理すべし。
try {
 foo();
} catch (...) {
 throw;
}
これで決まりではないか。
0094デフォルトの名無しさんNGNG
あー、C++なのか。
あれだけゴチャゴチャした言語仕様なのに、finallyが無いってのは
けっこうビックリだよな。
最近じゃVB.NETにすら付いたのに。
0095デフォルトの名無しさんNGNG
>>94
デストラクタで各オブジェクトに後始末させるからいいんじゃないの
0096デフォルトの名無しさんNGNG
newとdeleteそのまま書くのって、
Cでmallocやfree呼んでるのと実質変わらないよね。
reallocが無い時点でC++はゴミ。
例外機構なんてやめてlongjmp駆使した方が速いしわかりやすい。
longjmpでデストラクタ呼ばれないのはもうね、馬鹿(略
0097デフォルトの名無しさんNGNG
>>78
だな。
出口や入り口は少なければ少ないほど理解しやすくいいと言われてるのに、
例外処理はそれに完全に逆行してる
少なくてもC++では流行る気配すらないな
0098デフォルトの名無しさんNGNG
>>97
>出口や入り口は少なければ少ないほど理解しやすくいいと言われてるのに
気のせいです。
0099デフォルトの名無しさんNGNG
>>97
途中でリターンというのは、途中で一つの出口へのgotoと同じ事なのだよ。

int foo(void) {
 int ret;
 if(A) {ret=1; return ret;}
 if(B) {ret=2; return ret;}
 if(C) {ret=3; return ret;}
 ret=0;

 return ret;
}
   ↓
int foo(void) {
 int ret;
 if(A) {ret=1; goto end;}
 if(B) {ret=2; goto end;}
 if(C) {ret=3; goto end;}
 ret=0;

end:
 return ret;
}

関数の終わりの}の直前に飛んでいるだけなのさ。だから途中でreturnも出口は一つ。
0100デフォルトの名無しさんNGNG
関数型で書けよ。制御を終わらす意味でのreturnなんか無いぞ。
0101デフォルトの名無しさんNGNG
関数型には例外処理があんのか?
■ このスレッドは過去ログ倉庫に格納されています