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

1仕様書無しさん
前スレ

例外を正しく使えないプログラマ多いね。 その3
http://hibari.2ch.net/test/read.cgi/prog/1295659907/
2仕様書無しさん:2011/01/27(木) 12:27:12
いちいち例外クラスを定義するのがめんどくさい
3仕様書無しさん:2011/01/27(木) 12:30:20
いちいち返値を定義するのがめんどくさい
4仕様書無しさん:2011/01/27(木) 12:32:53
戻り値は簡単だよ。とりあえず-1かNULL返しとけば良いんだし。
5仕様書無しさん:2011/01/27(木) 13:23:53
http://www.parashift.com/c++-faq/exceptions.html
* [17.1] What are some ways try / catch / throw can improve software quality?
* [17.2] I'm still not convinced: a 4-line code snippet shows that return-codes aren't any worse than exceptions; why should I therefore use exceptions on an application that is orders of magnitude larger?
* [17.3] How do exceptions simplify my function return type and parameter types?
* [17.4] What does it mean that exceptions separate the "good path" (or "happy path") from the "bad path"?
* [17.5] Okay, so you're saying exception handling is easy and simple, right? New!
* [17.6] Exception handling seems to make my life more difficult; clearly I'm not the problem, am I??
* [17.7] I have too many try blocks; what can I do about it?
...
6仕様書無しさん:2011/01/27(木) 13:34:00
>>5
訳してみた。
http://www.parashift.com/c++-faq/exceptions.html
* [17.1] try/catch/throw がどうソフトウェアの品質を向上させるの?
* [17.2] わからないな。4行ほどのコード片でも戻り値が例外よりちっとも悪くないことを示すことができる。それなのになんでもっと規模の大きなアプリケーションで例外を使わなくちゃいけないの?
* [17.3] 例外がどう戻り値の型や引数の型を単純にするの?
* [17.4] 例外が「正常系」と「異常系」とを分けるというのはどういう意味?
* [17.5] はいはい、じゃぁあんたは例外処理は簡単で単純だと言うんだね?合ってる?
* [17.6] 例外処理は俺の人生をより面倒にするようだ。俺は悪くない、よね?
* [17.7] try ブロック多すぎ。どうにかできないの?
...
まさに FAQ
7仕様書無しさん:2011/01/27(木) 15:38:10
FAQって、いつもふぁっくゆーって読んでる。
8仕様書無しさん:2011/01/27(木) 18:12:28
例外が正しく使える、と言うのを定義した場合、それはどの様になる?
9仕様書無しさん:2011/01/27(木) 19:31:03
例外安全は必要条件だな
10仕様書無しさん:2011/01/27(木) 22:29:36
少し読まない間に1スレも進みやがって・・・
11仕様書無しさん:2011/01/28(金) 00:21:32
例外 VS 戻り値っていつも理解できるものと
理解出来ないものの構図になってるよね。
12仕様書無しさん:2011/01/28(金) 00:28:48
try {
 foo();
} catch(MyException e) {
  エラー発生時の処理
}

これで何がいけないのって聞いたら、
MyException以外の例外がfoo()から発生するかららしい。

----------------------------------------
ret = foo();
if(ret == MY_EXCEPTION) {
  エラー発生時の処理
}

で、このコードで、retがMY_EXCEPTION以外のエラーを返したら
困るでしょ?と聞いたら、retがMY_EXCEPTION以外のエラーを返したら、
それは仕様書に書いてないバグだから考えなくていいという。

----------------------------------------

話を戻すと、MyException以外の例外がfoo()から発生したら
仕様書に書いてないバグだから考えなくていいんじゃね?

----------------------------------------

この話の続きあった? それとも例外派が論破して終わった?
13仕様書無しさん:2011/01/28(金) 00:36:57
忘れた
14仕様書無しさん:2011/01/28(金) 01:01:03
896 名前: 仕様書無しさん [sage] 投稿日: 2011/01/26(水) 01:01:09
C#だと
http://msdn.microsoft.com/ja-jp/library/ms182137.aspx
に引っかかるんだよな。


これなんで?
15仕様書無しさん:2011/01/28(金) 01:10:19
>>14
エラーを戻り値で返す場合の戻り値の検査を省略するのと同じで
コーディングの方法としては悪いから警告されているだけ。

lintみたいなやつで、言語がだしている警告ではないので
意図してやってるなら問題ないよ。

普通のコーディングでは、Exceptionという汎用的な例外をトラップしたら、
例外を再スローするわけで、再スローするならば警告は出ない。

もし、Exceptionをトラップして、再スローしない場合があるとすれば、
どんなエラーが起きても(バグがあったとしてもという意味)
落ちないプログラムを作るときだけ。それも書くところは一箇所になるだろう。

説明はこれでいいかな?
16仕様書無しさん:2011/01/28(金) 01:14:35
Exceptionのような汎用の例外をトラップすることが
すべて禁止されているわけじゃなくて、再スローすれば
問題ないのか。

ということは、C#で例外が嫌いだからって
例外をトラップして戻り値に変換するような
コーディングは警告されるんだな。

例えばこんなコード。

int foo() {
  try {
    bar();
    return true;
  } catch(Exception e) {
    return false;
  }
}
17仕様書無しさん:2011/01/28(金) 01:28:28
>>15
サンクス!
1812:2011/01/28(金) 01:43:10
>>12のあとで、なんか話が続いたって話はないみたいだし
今も反論もないし、この件は例外派が言い負かしたってことでよかったのか。
19仕様書無しさん:2011/01/28(金) 01:44:07
>>12
> 話を戻すと、MyException以外の例外がfoo()から発生したら
> 仕様書に書いてないバグだから考えなくていいんじゃね?
いや、そもそもバクではない。
20仕様書無しさん:2011/01/28(金) 01:45:15
>>19
なんで?
たとえばヌルポがでたらバグでしょ。
21仕様書無しさん:2011/01/28(金) 01:48:33
ぬるぽしか思いつかないのか。
22仕様書無しさん:2011/01/28(金) 01:48:42
>>19
話がズレてる。

バグだといったのは、戻り値派の連中で、
仕様外の値が帰ってきたら
バグだといったんだ。

だから、俺にそれをバグじゃないと言われても困る。

いうなら、「関数から仕様外の値が返ってきても
バグじゃない」と、戻り値派の連中に言ってくれ。
23仕様書無しさん:2011/01/28(金) 01:50:30
関数から仕様に記述されていない値を返すのは明らかにその関数のバグだが、
関数から仕様に記述されていない例外が発生するのはバグとは言えない。
24仕様書無しさん:2011/01/28(金) 01:51:23
> 関数から仕様に記述されていない例外が発生するのはバグとは言えない。

理由は?

その肝心な理由が言えないから、
ここで話が止まったんじゃないの?

25仕様書無しさん:2011/01/28(金) 02:01:18
>>24
そもそも例外とはそのようなものだから。
逆に、決まった例外しか通知されないような状況を考えてみるといい。
「この関数はファイルIO例外しか投げません」と決めていても、
処理途中で別の例外的事象が発生したらどうすればいいんだ?
26仕様書無しさん:2011/01/28(金) 02:09:10
> 処理途中で別の例外的事象が発生したらどうすればいいんだ?

戻り値の場合はどうするよ?
そう考えると答えは明らかだろ?

関数の仕様に書いているのなら仕様。
そうでないのならバグ。
27仕様書無しさん:2011/01/28(金) 02:10:54
あと、参考までに

> 処理途中で別の例外的事象

が具体的にどんな例外なのか、
きっちりと書いてくれんか?
28仕様書無しさん:2011/01/28(金) 02:16:48
・発生しうる例外を列挙するために多大な労力をかけるか(それでも網羅しきれない)
・関数一つ一つにtry-catchの網をかぶせてそれぞれの関数が上に伝える例外を明示的に制御するか
・想定外の例外が発生するのを受け入れるか
例外と付き合うにはどれかを選ぶしか無いと思うよ。
29仕様書無しさん:2011/01/28(金) 02:21:34
>>28
戻り値の場合だと、それらはどうやって解決するんだ?
例外よりも簡単な方法があるのか?

その方法を書いてくれると、
俺は、それと同等の量で例外を使ったコードを書ける自信があるよ。


> 例外と付き合うにはどれかを選ぶしか無いと思うよ。

try {
 foo()
} catch(Exception e) {
 throw new FooException(e)
}
これでいいんじゃね?
30仕様書無しさん:2011/01/28(金) 02:30:23
>>29
戻り値だと、基本二番目の方法だね。それぞれの関数が上に伝える値を明示的に制御する。
一番目と三番目は戻り値では起きない問題。
31仕様書無しさん:2011/01/28(金) 02:33:01
>>25
Javaの場合に考えられるのはぬるぽ、OutOfMemory, 0除算、スタックオーバーフロー、無効な配列インデックスなど。
でもほとんどの場合コーディングミスによって発生するものなので、テスト段階で取り除けとしか言いようがないな。
例外が存在しないC言語なんかの場合、例外的事象が発生すればセグメンテーションフォルトや0除算を引き起こす。
そうなれば言語の仕組みとは別の所で強制終了となる。
戻り値だろうと例外だろうと「例外的事象」とか「想定外の例外」からは逃れられない。
だからがんばってデバッグしろとしか言いようがないな。
32仕様書無しさん:2011/01/28(金) 02:33:20
>>30
> 一番目と三番目は戻り値では起きない問題。
問題とか何言ってるの?

戻り値だと、2番目の方法を使うんでしょ?
例外でも2番目の方法を使えば、問題は解決だよね?

2番目を使えば問題は解決なんだから、
1番目と3番目では問題があるなんて、
をわざわざ言う必要ないじゃないか
33仕様書無しさん:2011/01/28(金) 02:35:39
ということで、このスレとしては例外は関数一つ一つにtry-catchの網をかぶせる方向で。
34仕様書無しさん:2011/01/28(金) 02:36:21
>>31
> 例外が存在しないC言語なんかの場合、例外的事象が発生すればセグメンテーションフォルトや0除算を引き起こす。
> そうなれば言語の仕組みとは別の所で強制終了となる。

それまずくない?

もしリソース解放する必要があったら戻り値の場合どうするの
この場合のリソースってのは、たとえば一時ファイルを作成して
処理終了後に一時ファイルを削除する。なんてフローがあったとき。

例外が存在しないC言語だと、強制終了になるというのなら、
リソースの解放ができないってことだよね。
35仕様書無しさん:2011/01/28(金) 02:40:04
>>34
だからLockファイルが消されずに残ってるなんてことがよくある
36仕様書無しさん:2011/01/28(金) 02:40:09
JavaにしたってVM落ちたとかマシンが落ちたとかの事態を想定して、
後片付けの手順は確立しとかないといけないんだからあまり変わらない。
37仕様書無しさん:2011/01/28(金) 02:40:12
>>33
> ということで、このスレとしては例外は関数一つ一つにtry-catchの網をかぶせる方向で。

その方向に反論するわけじゃなくて、
関数一つ一つにtry-catchの網をかぶせて、
catchした後どういう処理をするの?

この答えは戻り値の場合もどうせ同じことだから、
戻り値の場合で答えてくれていいんだけど

要するに、
int main() {
 if(func1() == ERROR) {
   ここに何を書くの?
 }
 if(func2() == ERROR) {
   ここに何を書くの?
 }
 if(func3() == ERROR) {
   ここに何を書くの?
 }
}
38仕様書無しさん:2011/01/28(金) 02:42:03
>>28
>>30
一番目は問題外で、誰もそんな選択肢は取らない。
二番目はよく見る状況だけど、あまり多すぎるようだと例外をうまく使えてない可能性が高い。
三番目はわりとよく見る選択肢で、問題だとは思わない。
39仕様書無しさん:2011/01/28(金) 02:43:04
>>37
そこは要件によるだろ。
40仕様書無しさん:2011/01/28(金) 02:43:29
int main() {
 if(func1() == ERROR) {
   return -1; // -1はfunc1でエラーが起きた
 }
 if(func2() == ERROR) {
   return -2; // -2はfunc1でエラーが起きた
 }
 if(func3() == ERROR) {
   return -3; // -3はfunc1でエラーが起きた
 }
 return 0;
}

こんな感じかな。
41仕様書無しさん:2011/01/28(金) 02:47:58
int main() {
 if(func1() == ERROR) {
   return -1; // -1はfunc1でエラーが起きた
 }
 if(func2() == ERROR) {
   return -2; // -2はfunc1でエラーが起きた
 }
 if(func3() == ERROR) {
   return -3; // -3はfunc1でエラーが起きた
 }
 return 0;
}

これだけだとfunc1の中で論理エラーでエラーになった場合に困るね。
0除算とかはそこで強制終了するけど、論理エラーの場合強制終了はされない。

int func1() {
  //何かしらの論理エラーが発生した場合
  exit(-4); //-4はfunc1内でエラーが発生した。
}

このようなコードが必要になるだろう。もちろん、func2、func3でも
exit(-5)、exit(-6)のように関数ごとに強制終了エラーコードが必要になる。
42仕様書無しさん:2011/01/28(金) 02:49:57
 if(func1() == ERROR) {
   return -1; // -1はfunc1でエラーが起きた
 }

って書いてるけどさ、
func1()がERROR2を返してきたら
どうするの?
43仕様書無しさん:2011/01/28(金) 02:51:15
>>41
終了させるなら、ログか標準出力にどこでどういったエラーが発生したかを吐き出して終了
が普通のセンスじゃね?
44仕様書無しさん:2011/01/28(金) 03:39:57
エラー処理を正しく作れないプログラマ多いね。
45仕様書無しさん:2011/01/28(金) 06:31:34
例外とか関係なく、エラー処理のやり方おかしい奴おおすぎ。

//func() 戻り値-1=異常 1=正常
ret = func()

こんな状況で実際に動かしたら0が返ってきた。
だからって0に対するコードを書いちゃいかんぞ?
今0が返ってくるのは「バグ」であって、明日には治ってるかも知れん。

だから、
if(ret == 1)
正常;
else
異常;
このようにして、現状バグの戻り値も異常扱いで流すのが正解。
とりあえず、それでプログラムは流れる。

例外の問題はこのような状況で落ちてしまうからだ。
テストをすすめるために、バグ例外に対応するコードを入れてやったりする。
それが気持ち悪い。
46仕様書無しさん:2011/01/28(金) 07:47:32
>>45
最後の2行で台無し
47仕様書無しさん:2011/01/28(金) 07:51:31
>>45
> 例外の問題はこのような状況で落ちてしまうからだ。
catch書けば落ちないだろ

馬鹿なのか?
48仕様書無しさん:2011/01/28(金) 08:15:27
聞くまでもなく馬鹿そのものだろう
49仕様書無しさん:2011/01/28(金) 08:45:49
バグとかよくわからん例外用のコードが必要なのが例外の欠点。
50仕様書無しさん:2011/01/28(金) 08:46:56
javaは可能性のある例外すべて対処してないとエラーでるな
これを記述してるだけでものすごい行数になっちゃう
51仕様書無しさん:2011/01/28(金) 10:28:00
>>47
まさにスレタイ通りの人発見
もしかしてcatch(Exception)やっちゃう人?
どんな種類の例外が来るか分からないのに?
52仕様書無しさん:2011/01/28(金) 10:28:01
>>45
てーか普通戻り値ってたとえば1だったり2だったり384だったりするけど
エラーのときだけ-1が帰ってくるようなもんじゃないのか。
だったら

ret=func();
if(ret < 0) {
 異常処理;
 return ret; //または return -1;
}
retを使った正常処理;

とすればインデントが深くならず異常が目立つ。
53仕様書無しさん:2011/01/28(金) 10:41:01
if(ret <0) ってcatch(Exception)とやってることが全く同じじゃんw

確かにフェイルセーフとかフォールトトレラントいう考え方は役に立つよ。
これ以上デバッグするコストかけられないから
バグっぽいものを全部異常扱いすることで納期に間に合うのならそれでもいい。
ていうか、テストにない使い方は一切拒否るくらいで良い。
54仕様書無しさん:2011/01/28(金) 10:56:21
>>53
同じじゃないよ

戻り値-1は呼び出した関数が失敗。復帰は容易
catch(Exception)はどこかで誰かが原因不明の失敗。復帰させる自信がなければログはいてアプリ終了
55仕様書無しさん:2011/01/28(金) 11:44:01
>catch(Exception)はどこかで誰かが原因不明の失敗。
つまり呼び出した関数が失敗してるってことでしょ。
戻り値の場合でも呼び出した関数の中で呼び出したどこかの誰かが作った関数に原因不明のエラーがあったら
同じようにエラー返すんだから結局同じ。
56仕様書無しさん:2011/01/28(金) 12:28:18
>49
例外対策だと一目でわかるのがメリットでもあるわけだが
返値をif/swicthではなにがなんだか

>50
どうやってもならねーよハゲ
57仕様書無しさん:2011/01/28(金) 13:44:06
ハゲではなくフサフサであった場合。
----
try {
 ハゲ氏ね();
} catch (フサフサException exception) {
 髪よこせ();
}
----
if (ハゲ氏ね() == フサフサだぜw) {
 髪よこせ();
}
----
じゃなくて、普通は
----
if (お前ハゲじゃね?()) {
 ハゲ氏ね();
} else {
 髪よこせ();
}
----

基本的に戻り値も例外も、エラーはあまり発生させない方がいいわな。
58仕様書無しさん:2011/01/28(金) 14:29:43
本当はハゲだけど見栄を張りたい場合、

bool 正常終了 = false;
while(正常終了 = false) {
try {
  ハゲ氏ね();
  デブ氏ね();
  収入1000万以下は氏ね();
  正常終了 = true;

} catch(は、ハゲなんかじゃないだからバカ!Exception ex) {
  毛生えクスリ(俺の頭);
} catch(太ってなんか無いわよバカ!Exception ex) {
  ランニング();
} catch(お金なら持って来たわよ。これで文句ないんでしょバカ!Exception ex) {
  財布.出す(1000万円);
} catch(Exception ex) {
  うるさいうるさいうるさい!();
  throw ex;
}
}
59仕様書無しさん:2011/01/28(金) 14:59:38
>本当はハゲだけど見栄を張りたい場合、
本当にハゲであるなら、見栄を張らずに「ハゲ」だと言わなければならない。
戻り値でも例外でも、

try {
 ハゲ氏ね();
} catch (ハゲじゃねーしwwwException exception) {
 //実はハゲ
}
----
if (ハゲ氏ね() == ハゲじゃねーww) {
 //実はハゲ
}
----
if (お前ハゲだろ?() == false)
{
 //実はハゲ
}
---
いずれの場合でも、見栄を張ったほうが悪い。
見栄を張ってる場合に上位で例外処理や戻り値によるエラー処理を追加してはならない。
60仕様書無しさん:2011/01/28(金) 15:05:46
俺のわかる話に戻してもらおうか
61仕様書無しさん:2011/01/28(金) 15:16:42
C++ではcatch(...)で全ての例外を拾えることを
最近になって知りました(テヘッ
62仕様書無しさん:2011/01/28(金) 21:15:18
>>55
戻り値は勝手に伝播しないので、火元の分からないエラーは存在しない(はず)
if (ret == -1) longjmp(...) とかやってない限りはw

例外はこれが簡単に起こるのが弱点
catch(...)で防げるかも知れないが、もはや正常系には戻れない
63仕様書無しさん:2011/01/28(金) 21:36:01
>>62
もう少し訓練を積んだほうがいいんじゃないか?
伝搬とか考えるからだめなんだよ。

foo()という関数があった、
その中の実装はお前が考えることではない。

foo()という関数がSQLExceptionという例外を出した、
それはもしかしたら中で使っている何かがだしたのかもしれないが
内部の実装なんだからお前が考えることではない。

凄くシンプルに、foo()がSQLExceptionをだしたと考えれば、
なんの問題もないはずだ。違うかね?
64仕様書無しさん:2011/01/28(金) 21:37:10
>>62
> catch(...)で防げるかも知れないが、もはや正常系には戻れない

catch(...)で防げると分かっていて、正常系に戻れないとする
根拠はなんだ?

戻り値にはない理由で答えよ。
65仕様書無しさん:2011/01/28(金) 21:45:29
こんな話を聞いたことがある。

アセンブラでバリバリプログラムしていた人が
C原語を使ったとき、この変数はメモリマップのどこに
割り当てられるのか分からないと悩んだらしい。

つまり抽象的に考えるという適性がないから、
内部の実装ばかり気にして高級な言語を使えない。
そんなプログラマがいるそうだ。

たぶん、例外を理解出来ないのもそういうたぐいなんだろう。
66仕様書無しさん:2011/01/28(金) 22:13:02
try{
 hoge();
 hage();←こいつが例外出すとは思わなかった(でも別に無視してくれてもいい)
 huge();
 hige();
}catch{
 略
}

ってときに流せないな
67仕様書無しさん:2011/01/28(金) 22:14:50
try{
 hoge();
 try {hage();}catch(){} ←こうすればいいだけ
 huge();
 hige();
}catch{
 略
}


反論終了
68仕様書無しさん:2011/01/28(金) 22:16:04
例外だすとは思わなかったのに、
なんでなんの例外かわからないものを
無視していいってわかるんだろうなw
69仕様書無しさん:2011/01/28(金) 22:20:18
>>66
そーゆーとき突然落ちるな
70仕様書無しさん:2011/01/28(金) 22:21:38
>>66ではないが。
何の例外かなどどうでもいい、hage()をコールした事実だけがあればいい。
と言う処理もある。
71仕様書無しさん:2011/01/28(金) 22:22:08
例外が出たってことは、
処理が正しく行われてないってことなんだから、
正常終了しましたじゃだめだろw

こんなこと子供にだってわかること。
72仕様書無しさん:2011/01/28(金) 22:22:41
>>71は見識が浅い
73仕様書無しさん:2011/01/28(金) 22:24:23
>>70
> 何の例外かなどどうでもいい、hage()をコールした事実だけがあればいい。

じゃあ、コールした事実があればいいということを
明確にするべきだよ。

つまり、try catchで囲って、catchにコメントでなにもしない理由を書く。


戻り値のエラーが省略されているのをみたら、
普通の人はエラーチェックをサボってる
このままだとエラーが起きているのに正常終了してしまう。
これはバグだって思う。
74仕様書無しさん:2011/01/28(金) 22:26:10
>>71
関数作った奴の思想がなんでもかんでも例外にしていたら
そんなことできねぇんだよ
75仕様書無しさん:2011/01/28(金) 22:27:08
>>73
アホか、コールされる関数の仕様に、XXXで使用する場合、エラー処理不要。
と書けばいい
76仕様書無しさん:2011/01/28(金) 22:27:13
戻り値チェックの一番の欠点は、
エラーが起きてるのに、次の処理に進んでしまうことだよな。

たとえば、ファイルをバックアップして
オリジナルを削除するなんてとき、
ファイルのバックアップに失敗したのに、
オリジナルを消してしまい、データが失われてしまう。
77仕様書無しさん:2011/01/28(金) 22:28:31
>>75
> アホか、コールされる関数の仕様に、XXXで使用する場合、エラー処理不要。
> と書けばいい

なんで関数側で利用方法を決めるんだよw
逆だろ。
お前設計できないな。

78仕様書無しさん:2011/01/28(金) 22:29:15
>>76
わざわざ駄目な例を出して批判しても、説得力がない。
79仕様書無しさん:2011/01/28(金) 22:29:22
>>74
ふーん、でも具体例は挙げられないよね?
80仕様書無しさん:2011/01/28(金) 22:29:38
>>76
そういうのだったらエラーチェックするじゃん
どーでもいい関数が例外吐いて処理止めちまうとか嫌じゃん
開発やってるときなんていちいちドキュメント書かないから
そいつのところいってあれこれ話すの面倒臭いよ
81仕様書無しさん:2011/01/28(金) 22:30:00
try{
 hoge();
 try {hage();}catch(){} ←こうすればいいだけ
 huge();
 hige();
}catch{
 略
}

こういうソースが気に入らないnだよw
結局、使っている関数の中身をみる必要がある。
そうしないと落ちてしまうからだ。
82仕様書無しさん:2011/01/28(金) 22:30:02
>>78
えーw わざわざダメな例を出したのは
エラー出ても無視していいんだよ!なんていってる方じゃないかw
83仕様書無しさん:2011/01/28(金) 22:30:20
>>77
菅-笑える反論なんだが。
利用方法を指定しない関数なんて有るのか?
84仕様書無しさん:2011/01/28(金) 22:31:03
>>81
> 結局、使っている関数の中身をみる必要がある。
> そうしないと落ちてしまうからだ。

おれは、hageの中身を見てないんだが、
このコードは落ちないだろ?w
85仕様書無しさん:2011/01/28(金) 22:31:16
>>79
ファイルを開く処理でファイルがないときに例外を吐くとかウザイぜ
86仕様書無しさん:2011/01/28(金) 22:31:50
>>82
キミは議論に参加しない方がいいよ、混ぜっ返すだけだから
87仕様書無しさん:2011/01/28(金) 22:31:58
>>84
中身みてないなら、なんでhageだけ囲んでいるんだよw
88仕様書無しさん:2011/01/28(金) 22:32:35
>>81
いまその話してなくね?
それって対処済みなわけじゃん
1回引っかからないとそいつが例外吐くかどうかわからないよね
89仕様書無しさん:2011/01/28(金) 22:33:55
>>83
お前の言ってる利用方法ってなんのことだ?
なんかすごい勘違いをしてそうだな。

> アホか、コールされる関数の仕様に、XXXで使用する場合、エラー処理不要

このXXXには具体的に何が入るんだ?
いってみ。

エラーを返すのに、絶対にエラー処理が不要なんて
関数はありえないだろ。
90仕様書無しさん:2011/01/28(金) 22:34:35
>>85
> ファイルを開く処理でファイルがないときに例外を吐くとかウザイぜ

例外を出さないと、
ファイルを開いてないのに、
開いてないファイルに書き込もうとするよな?
91仕様書無しさん:2011/01/28(金) 22:35:33
>>87
> 中身みてないなら、なんでhageだけ囲んでいるんだよw

この関数でエラーが出ても無視したいという
いったから。

92仕様書無しさん:2011/01/28(金) 22:35:42
try{
 string path = "";
 fileopen1(&path);←読めなかったらfileopen2で読むからスルーでいいんだよ例外吐くな馬鹿!
 
 if(!path.Length()){←パスがなければ~
  fileopen2();
 }
}catch{
 略
}

ってときにイラっとくる
93仕様書無しさん:2011/01/28(金) 22:36:51
>>92
わざわざ特殊な例を出しても、説得力がない。
94仕様書無しさん:2011/01/28(金) 22:37:47
>>92
> fileopen1(&path);←読めなかったらfileopen2で読むからスルーでいいんだよ例外吐くな馬鹿!

そういうことは、コメントで書かずに、

読めなかったらスルーするという
コードを書いてください。

95仕様書無しさん:2011/01/28(金) 22:38:26
>>93
えー、しょっちゅうやるよー

iniになければ~
DB1になければ~
C:\になければ~
regになければ~

少なくとも俺の経験ではめっちゃある
96仕様書無しさん:2011/01/28(金) 22:41:39
関数用意した奴が例外だと思ってるもんでも
呼び出した側からしたら例外になんてならないと思ってるとかいう認識の違いから
こういうのよくおきるよね

現に>>90なんてこういうコードだって可能性がすっぽり頭から抜けてるもんね
97仕様書無しさん:2011/01/28(金) 22:43:29
まあ、例外あってもいいんだけど
あくまで使う側から要望のあった例外のみを出したほうがいいと思うね
98仕様書無しさん:2011/01/28(金) 22:43:34
>>95
別にそれは例外でもかけるから、ネタとして取り上げる価値がない。
99仕様書無しさん:2011/01/28(金) 22:45:15
void foo() って関数の中で使っている関数が
エラーを出したとき、例外を使わないで
どうやって中で起きたエラーを通知するんだ?
10099:2011/01/28(金) 22:46:34
たとえば0除算エラーが起きたら
落ちてしまうだろ。

戻り値の場合、落ちないことがメリットと
考えているわけだから、
こういう場合どうするんだ?
101仕様書無しさん:2011/01/28(金) 22:49:18
>>99
そりゃ戻り値必要なんだろその関数w

>>100
0徐は明示的なチェック(仕様的な)が必要
例外で片付けては駄目
102仕様書無しさん:2011/01/28(金) 22:49:45
>>100
関数内で落ちるんだから、どうでもいいじゃん。
作った奴の責任だ。

例外は他人に責任を押し付けるから厄介。
103仕様書無しさん:2011/01/28(金) 22:52:27
>>99
> そりゃ戻り値必要なんだろその関数w
いや、戻り値は要らない。

> >>100
> 0徐は明示的なチェック(仕様的な)が必要
> 例外で片付けては駄目

それでもやってしまった場合はどうするんだ?

104仕様書無しさん:2011/01/28(金) 22:53:16
>>102
> 例外は他人に責任を押し付けるから厄介。

戻り値を返すってことは、他人に責任を押し付けてることになるだろ?
105仕様書無しさん:2011/01/28(金) 22:57:41
>>104
ならないよ。使う側はソース変えるつもり無いし。
必死で戻り値に色々な意味を与えても使う側はスルー。
大体、cの標準関数だって、ほとどのプログラマは戻り値無視。
何か特別な事情ある時だけチェックし、エラー処理する。
106仕様書無しさん:2011/01/28(金) 22:57:46
戻り値を返さない関数が、
戻り値を返すようになるって
開発してたらよくある話だと思うけどね。

最初の設計では戻り値を返していなかったから、
当然その関数を使っていたところではエラーチェックが行われていなかった。

開発が進んで機能が増えたら、戻り値でエラーを返す必要が出てきた。
そしたら、さあ大変。

この関数を使っている関数にエラーチェックを追加し
エラーだったらエラーの詳細コードを返すように変更。

でさらにこの変更になった関数を使っている関数を変更
さらにこの関数も変更ってエラー処理のためのコードが
あちこちに伝搬してしまう。
107仕様書無しさん:2011/01/28(金) 22:58:48
> 大体、cの標準関数だって、ほとどのプログラマは戻り値無視。
> 大体、cの標準関数だって、ほとどのプログラマは戻り値無視。
> 大体、cの標準関数だって、ほとどのプログラマは戻り値無視。


だからお前のプログラムはいつもバグばっかりなのか。
108仕様書無しさん:2011/01/28(金) 23:01:38
>>106
そんなぐだぐだな環境でPGやってるのか。
109仕様書無しさん:2011/01/28(金) 23:03:08
>>108
戻り値使ってる所ではよくある光景だったね。
前の会社でデスマになってた。
エラーチェックしてないものだから
動いてるのになんかおかしい!っていつも騒いでたよw

今は例外を使っているから
このような問題はなくなったね。
110仕様書無しさん:2011/01/28(金) 23:04:34
そもそもよっぽど簡単なプログラムじゃない限り、関数の戻り値によって制御パス変える
なんてことはやってるわけで、例外使ってわざわざ醜い制御パス増やす必要性を感じない。
111仕様書無しさん:2011/01/28(金) 23:04:36
>>109
その会社のプログラマ全部入れ替えろw
112仕様書無しさん:2011/01/28(金) 23:05:30
> 今は例外を使っているから
> このような問題はなくなったね。
誰かが握りつぶしてくれてるんだろう、感謝しなさい。
113仕様書無しさん:2011/01/28(金) 23:05:31
>>103
はぁ?ってかお前、明らかに議論に加われるレベルじゃねーぞ
114仕様書無しさん:2011/01/28(金) 23:06:56
>>106
何が言いたいのか意味不明
よく読んでないけど
発生させてなかった正常系例外が途中で加わったときぐらい混乱する内容なの?
115仕様書無しさん:2011/01/28(金) 23:06:58
>>110
例外ってのは0除算と同じで通常の制御パスとは
すでに外れたルートに突入してるんだよ。

0除算やったら落ちるだろ?
それと同じ。

むしろ通常の制御パスから
以上ルートを取り除くことに成功したわけで、
通常の制御パスがよりシンプルになる。
116仕様書無しさん:2011/01/28(金) 23:09:51
>>115
どう考えても0徐の対処は仕様的な決定が必要になる
出した例に意味がない

お前、さっきから背伸びして参加してる異常にレベルが低い奴?
117仕様書無しさん:2011/01/28(金) 23:10:14
>>114
voidがboolになるだけなら簡単だけど、
元々の関数がintの場合、たかがエラーのために、
intがlongになってintの範囲は戻り値のために使うから、
それ以外の範囲の値をエラーにしなくちゃならないからね。

エラーと言っても、なんのエラーなのかを返さないといけないから
単純にfalseを返せばすむって話じゃない。

関数の戻り値の型ごとに複雑な仕組みで
エラーの値を返さなければならなくなる。
118仕様書無しさん:2011/01/28(金) 23:11:32
>>116
> どう考えても0徐の対処は仕様的な決定が必要になる
> 出した例に意味がない

レスする前にちょっと良く考えてみて。

仕様的な決定が必要にならない例って
あるのか?
119仕様書無しさん:2011/01/28(金) 23:11:35
>>115
落ちるしかないような制御パスならいいけど、
ファイルが無い程度で例外出されたらたまらない。
120仕様書無しさん:2011/01/28(金) 23:11:39
>>117
は?
121仕様書無しさん:2011/01/28(金) 23:12:33
>>119
try catchでファイルがない時の処理を書けばいいだけでは?
122仕様書無しさん:2011/01/28(金) 23:13:00
>>118
馬鹿すぎる
少し黙ってろ
123仕様書無しさん:2011/01/28(金) 23:13:25
>>118
たしかに思いつかないなw
124仕様書無しさん:2011/01/28(金) 23:14:08
>>122
お前は見事に黙った(反論しなかった)なw 
125仕様書無しさん:2011/01/28(金) 23:16:23
0徐のチェックなんてそもそもコードがおかしいじゃねぇか
チェックがあって対処がないならそれはただの仕様漏れであって
プログラムの話じゃねぇんだよ

問題の切り分けもできないカスが議論に参加してきたよ
126仕様書無しさん:2011/01/28(金) 23:16:38
ファイルが無い場合のエラー処理を追加するくらいなら、
ちゃんとファイルを用意すればいい。

欧米さんのプログラムなんて、あるべきファイルが無かったら
うんともすんとも言わなくなるのが多いぜ。
127仕様書無しさん:2011/01/28(金) 23:18:02
>>121
戻り値のチェックをするのは面倒だけど、try catchブロックを書くのは厭わないというわけか。
128仕様書無しさん:2011/01/28(金) 23:18:15
>>125
> 欧米さんのプログラムなんて、あるべきファイルが無かったら
> うんともすんとも言わなくなるのが多いぜ。

それ、例外を使ってないからだな。
129仕様書無しさん:2011/01/28(金) 23:18:19
0徐の前に分母が0に近いか0かどうかをチェックするけど
それを例外で出しちゃうの?
130仕様書無しさん:2011/01/28(金) 23:21:00
>>128
そうかもな。
だがエラー処理のコストは馬鹿にならないから、
戻り値を無視するのが欧米流。
ファイル用意してないやつが悪いんだし。
131仕様書無しさん:2011/01/28(金) 23:21:01
>>127
戻り値のチェックの場合は、

たとえば、ファイルを開く時、
ファイルがないというエラー以外に、
その他のたくさんにエラーコードに対処しないといけないからね。

例外だと、その他のエラーをすべてまとめて処理することができる。
132仕様書無しさん:2011/01/28(金) 23:21:49
>>130
アメリカ流じゃなくて、
クソコード=戻り値を使っている。
では?
133仕様書無しさん:2011/01/28(金) 23:24:02
C言語しか知らない時点で
戻り値厨の方が知識の幅が狭いのは
みんなの共通認識である。
134仕様書無しさん:2011/01/28(金) 23:24:12
ファイルを用意しろって仕様に対してファイルを用意しない奴。
その為にエラーメッセージとかエラーコードとか
割り当てるのは手間だろ?
マニュアルにも書かねばならんし。
135仕様書無しさん:2011/01/28(金) 23:24:39
>>131
ファイルオブジェクトがNULLかどうかチェックすればいいだけ。
136仕様書無しさん:2011/01/28(金) 23:48:00
ほんっと頭の固い馬鹿だな
137仕様書無しさん:2011/01/29(土) 00:19:59
28日のバトルは戻り値側の圧勝だったな
138仕様書無しさん:2011/01/29(土) 00:33:50
吹いた
139仕様書無しさん:2011/01/29(土) 01:12:42
勝利宣言(笑)
140仕様書無しさん:2011/01/29(土) 03:16:34
おまいらすみません。

想定がWEBアプリですか?
バッチみたいな上から下への
フローダウンするアプリですか?

141仕様書無しさん:2011/01/29(土) 07:58:30
>>140
WEBアプリもバッチファイルも変わらん。

バッチファイルも、途中で処理がエラーに成ったら
途中で中断しないといけないし、

WEBアプリは、リクエストが途中でエラーに成ったら
そのリクエストはやっぱりそこで中断しないといけない。

GUIアプリは、ユーザーのクリックで処理が開始され、
その途中でエラーに成ったら、処理は中断

どのアプリにも共通なのは、処理が途中でエラーに成ったら
途中で中断しなければならないということ。
処理が続けられるのは想定内の一部のエラーだけ。
142仕様書無しさん:2011/01/29(土) 08:33:02
信頼性が高いシステムに要求されるのは
たとえ処理の一部にバグがあっても、システム全体は落ちないということ。
もちろん、落ちないだけじゃなく内部的に正しい状態になってないといけない。

だからNULLポインタ参照や0除算で落ちることはあってはならない。
この時点で例外が存在しないC言語は信頼性が高いシステムには向かない。
もちろん不可能ではないが、コストがかかり過ぎで選択肢にならない。

落ちないことと内部が正しい状態になるかは別の話で、
これが戻り値だと、簡単に内部が不正な状態になる。
戻り値のチェックをサボったり適切にしないだけで
不正な処理が行われる。

例外の場合は、一番外(もしくは途中の起点となる所)でcatchするだけで、簡単に落ちないシステムは作れるし、
finallyという不正な状態をリカバリする場所が用意されているものが多い。(なければcatchで行う)

不正な状態を作らないためには、一つの関数だけを注意していればいい。
関数内で状態を変更する処理をしたらその関数でリカバリ処理をする。

このように例外を使えばエラーが起きたときに内部を不正な状態にしないための
やり方が確立されているので信頼性が高いシステムが作れる。
143仕様書無しさん:2011/01/29(土) 09:56:56
>>142
一番外でcatchして何ができるというの?
結局、ユーザーに通知、またはシステムを落とすあたりで妥協するでしょ?

戻り値にしろ例外にしろ、エラー時に正しく処理をしなければ
信頼性が高いシステムは作れない。
144仕様書無しさん:2011/01/29(土) 10:18:07
>>143
エラー時に正しく処理をするなんて、当たり前の前提なのでは?
このスレ見る限りその前提すら認識できていないやつも多いけどさ。
145仕様書無しさん:2011/01/29(土) 11:03:20
>>144
そうね。とくにUIのあるアプリケーションのプログラミングなんて
コード全体の8割がエラー処理みたいなもんだよね。
146仕様書無しさん:2011/01/29(土) 11:48:47
>>143
> 戻り値にしろ例外にしろ、エラー時に正しく処理をしなければ
> 信頼性が高いシステムは作れない。

当たり前。

で、その当たり前のことをやる場合のコストを考える。
なんども戻り値厨が言ってるように、
戻り値では「コストが高いからエラー処理を省く。(例 printf)」
まあ、このような手抜きが当たり前に行われているんだ。

だけど、例外だとコストを上げずにエラー処理を行える。
147仕様書無しさん:2011/01/29(土) 11:53:15
>>143
> 一番外でcatchして何ができるというの?

たとえば、Wordだと文書を編集中に
「装飾ボタン」を押してその処理にバグがあって
画面に「内部でエラーが発生しました」と表示する。

だけどシステム(Word)は落ちずに、別の処理を行える。
データが消えなくてすむ。

まあ、こんなことができるよ。
148仕様書無しさん:2011/01/29(土) 11:56:10
戻り値で戻して来る場合って
戻って来た値そのものが例外ってこともあるよねー。
149仕様書無しさん:2011/01/29(土) 13:03:11
そもそもの話。
例外処理がなくても、エラーが出たら、breakしたり、returnして戻っていけばいいのでは?
その答えとして、奥深い場所でエラーが起きた場合、ちまちまreturnしながら戻りますか、と答えておく。
つまり、メンドウ、というわけだ。
150仕様書無しさん:2011/01/29(土) 13:14:10
戻り値マンセー君はエラー処理をなるべく手を抜きたいと言ってるようにしか見えん
あふぉかと
151仕様書無しさん:2011/01/29(土) 13:30:15
バグなんだから起きたときに不正な動作をして、システム・データを
破壊したとしても責任は持たないと言っているのが戻り値厨

バグであってもそれをコントロールし不正な動作はしないように
しているのが例外使い。
152仕様書無しさん:2011/01/29(土) 13:37:34
GC なし言語で自分でメモリ管理するようなもんで、戻り値派でも
完全にエラーをチェックできる・している人はそれはそれでいいんだよ。

単に、例外使うほうがエラーチェックに抜けができにくいってだけで。
153仕様書無しさん:2011/01/29(土) 13:43:24
Windowsの小物アプリばかり作ってると想定外の例外即アボートなので例外のほうが楽かも
154仕様書無しさん:2011/01/29(土) 13:55:11
そもそもスレタイがこうなのになんで例外と戻り値の戦いになってるんだ?
CだってlongjmpやerrnoもあるしJavaにもエラーの戻り値あったりすんじゃん。
例外がある言語でうまく使わない、あちこちでなんでも握りつぶす奴いるよね、
あるいは続けられるのに例外っつとなんでもログ吐いて落とす奴いるね
とかいう話じゃないのか?
155仕様書無しさん:2011/01/29(土) 14:16:43
もともとふっかけてきたヤツの論調が
例外キラーイ!戻り値のほうが楽なんだよ!
例外なんて特殊なケース以外で使うな!
なんだからこうなる罠
156仕様書無しさん:2011/01/29(土) 14:48:59
所詮バカはなにやったってバカ
戻り値使ったってポカやってるに違いない。
バカだからポカしたことに自分が気付かないだけで。
157仕様書無しさん:2011/01/29(土) 16:29:12
自分が馬鹿じゃないという自信があるなら例外を使えばいいんじゃない?
本当に馬鹿じゃなければ使いこなせるはず。

成果主義を思い出すな。
みんな自分がデキるやつだと思っていて喜び勇んで導入したら
本当にデキるやつは一握りであとは減俸やリストラの口実に使われただけだったという。
自分が馬鹿だと気付かない馬鹿は本当に頭のいいやつにハメられるしかない。
158仕様書無しさん:2011/01/29(土) 19:00:19
>>157
というかさ、例外ってのはC言語の時代にはなく、
C++も最初搭載されてなく、その後で追加され
そして最近できた言語にはもれなく付いている機能なんだよ。

馬鹿かどうかで例外を使うとかじゃなくて、
例外を使おうかどうか悩むまでもなく
すでに今は例外を使うことが当たり前。

使えてあたりまえだし、使いこなせなければ、
それこそ馬鹿の烙印を押される。
159仕様書無しさん:2011/01/29(土) 19:24:13
つまり例外すら使えない馬鹿は淘汰されろというのが例外に込められたメッセージなわけで、
自分が馬鹿だと気付いていない馬鹿を例外を使わないやつは馬鹿だと誘惑して業界の口減らしをする。

馬鹿だからってそうやすやすと殺されてはたまりません。
きゃつらの欺瞞と陰謀を暴きこの世界に平穏と安寧を取り戻すため
我ら戻り値派に清き一票を!
160仕様書無しさん:2011/01/29(土) 19:27:01
良い悪いよりも使用禁止されてるんだろ?例外って。
それで話終了じゃん。
161仕様書無しさん:2011/01/29(土) 19:31:15
オブジェクト指向もぶっちゃけセミナー御用達言語で
生産性がいくら上がるかって数字で出せって言われたら困るしね
162仕様書無しさん:2011/01/29(土) 19:31:21
使用禁止されてないけど?
言語標準機能が禁止されるわけ無いだろw
163仕様書無しさん:2011/01/29(土) 19:34:59
googleさんのとこでは駄目だってね
164仕様書無しさん:2011/01/29(土) 19:38:38
それはGoogleの話だろw
例外のほうが優れていると認めてるし、理由はすでに例外を使ってないコードが
大量にあるからってだけで、今から作り直せるとしたら例外を使っていると言ってるし。
しかもJavaでは普通に例外を使ってるし。

そういうごく一部の例外的なあつかいのものを、その根拠を理解せずに、
Googleが禁止だからうちも禁止!とか言ってればそれこそ馬鹿だよ。
165仕様書無しさん:2011/01/29(土) 19:53:17
ところで、禁止かどうかの話と、正しく使えるかどうかの話は全く別物じゃない?
それこそ、禁止どころか推奨しまくってても、正しく使えない馬鹿だっているだろうし。

このスレって、そういうスレなんじゃねーの???
166仕様書無しさん:2011/01/29(土) 20:00:10
正しく使えるならその危険性も熟知しているだろうし推奨はしないだろう。
推奨してるのは例外使える俺スゲーしたい(しかし大抵は握りつぶすだけの)DQN。
167仕様書無しさん:2011/01/29(土) 20:02:44
お前のほうがDQNに見えるw
168仕様書無しさん:2011/01/29(土) 20:24:12
C++標準ライブラリなんかも例外使ってるからなぁ。
例外を馬鹿にするってことは言語自体を馬鹿にしているのと一緒で
一体誰に喧嘩売ってるのかわかってるのかな、このDQNは。
169仕様書無しさん:2011/01/29(土) 20:49:10
ライブラリならいいと思うが。

例外の欠点は何がスローされるか保証されないことであり、
ライブラリとして完成されたものなら問題ないと思う。
170仕様書無しさん:2011/01/29(土) 20:50:17
何がスルーされるか保証されないことがそんなに問題か?
171仕様書無しさん:2011/01/29(土) 20:56:45
>>170
・設計時に考慮するべき項目が増える
・試験パターンが増える
・メンテナンスコストが増える
172仕様書無しさん:2011/01/29(土) 21:00:47
・めんどくさいからと自分とこで握りつぶす奴がいる
173仕様書無しさん:2011/01/29(土) 21:00:56
>>171
設計時に何を考慮するのさ?
なんで試験パターンが増えるのさ?
なんでメンテナンスコストが増えるのさ?

例外なんて、すべてエラーとして扱えばいいだろ。
エラーなんて一種類だよ。Exception型一種類。
戻り値で言えば、どんなエラーでもfalse返すのと同じ。

エラーを区別したい時だけ、考えればいいだけ。
174仕様書無しさん:2011/01/29(土) 21:10:04
ほらこういうのがいるから。
175仕様書無しさん:2011/01/29(土) 21:10:27
反論できないから一言で済ますわけか。
176仕様書無しさん:2011/01/29(土) 21:11:20
それは>>167に言ってくれ。
177仕様書無しさん:2011/01/29(土) 21:12:18
言おうが言うまいがそれはどうでもいい。

>>173に反論がないという事実に何も変わりはないから。
178仕様書無しさん:2011/01/29(土) 21:21:40
ここで想定外の例外が発生したときにどう動くのかとか聞かれない現場は楽でいいね。
179仕様書無しさん:2011/01/29(土) 21:23:53
>>178
答えればいいだけだろ?
180仕様書無しさん:2011/01/29(土) 21:28:32
>>178
そのときはシステムが落ちる。
落ちるのでどの段階で回復させるか書かないといけない。
そうやってシステムが満足に動くようになるまで個別に例外を捕捉し続ける。
Exception一択なんて例外を正しく使えないことを自白しているようなもの。
181仕様書無しさん:2011/01/29(土) 21:28:35
>>179
その分コストかかるよね。
「落ちます」「握りつぶしてるから大丈夫です」以外の答えを用意しようとすると。
182仕様書無しさん:2011/01/29(土) 21:33:48
>>180
システムが落ちるかどうかは作り方次第だろ?

お前難しく考えすぎ。
処理を小さい単位で考えないからそういう事になる。

関数はすべて実行されるか、全く実行されないかの
二つの状態になるように作ればいい。
トランザクション、原子性という考え方だよ。

それを満たすように作れば、簡単に回復したいタイミングで
回復させることができる。

>>181
戻り値でやろうとするとコストがかかるが、
例外だとコストはかからない。
183仕様書無しさん:2011/01/29(土) 21:34:47
ソレは戻り値でもかわらんだろ…とこーやって延々ループしてるだけじゃねーか。
例外をどううまく使うかって建設的なほうにいけばどうか。
俺はJavaみたいに業務エラーでもなんでも例外より
.NET風に例外はあくまで業務上の想定外、がいいと思う。
184仕様書無しさん:2011/01/29(土) 21:35:37
想定外のエラーで「落ちます」と「握りつぶします」以外に対処のしようなんて無いだろ
185仕様書無しさん:2011/01/29(土) 21:35:57
>>182
> 戻り値でやろうとするとコストがかかるが、
> 例外だとコストはかからない。
なぜ?
186仕様書無しさん:2011/01/29(土) 21:37:34
>>184
「想定外のエラー」と「想定外の例外」は違うんだな。
ま、エラーの時だけ例外を投げるようにするんならまだいいんだけど。
187仕様書無しさん:2011/01/29(土) 21:39:47
>>184
だから、文字通りの「例外」でいいんじゃない?
想定外だったらログ出して落とすか無視して続けるかしかない。
例外にビジネスロジック入れようとするから混乱する。
188仕様書無しさん:2011/01/29(土) 21:41:56
ビジネスロジックを除けば例外の大半は事前に入力値をチェックするだけで
避けられるものばかりのような気がする。
189仕様書無しさん:2011/01/29(土) 21:44:30
>>185
関数内でエラーが発生したらエラーが発生したという情報を
親の関数に返さないといけない。

だから大抵の関数は、戻り値としてエラー値を返すことになるから
エラーを戻り値に混ぜるかしないといけない。
(例 たとえばこの関数は正の整数しか戻り値に使わないからマイナスをエラーコードにする等)
関数ごとに何の値をエラーコードとして使えるか違うし、
汎用的にエラーの値を返す方法がない。

つまり、実際の関数がそうなっているが、どういう値を返したらエラーなのか
関数ごとに調べる必要があるし、関数ごとにエラーの処理方法も違っている。

そして関数で起きたエラーコードを親に返すわけだが、またそこでどんな値で
返すか悩むことになる。

エラーコードをどうやって返すか考えるコストがかかるし、
そのエラーコードを解釈するのにもコストがかかる。
統一的なやり方がない。
190仕様書無しさん:2011/01/29(土) 21:45:17
でもそれじゃ例外の意味なんてないよね。
それとも敢えて例外が発生するまで待つのが得策か……?
191仕様書無しさん:2011/01/29(土) 21:46:38
必ずあるはずのリソースが存在しなかった、
みたいなのをビジネスロジックと呼ぶのはどうかというのは少しあるがな。
そんなのは例外でいいとおもわんでもない。
192仕様書無しさん:2011/01/29(土) 21:47:56
>>189
いや、だからそれは設計の問題だろ…
193仕様書無しさん:2011/01/29(土) 21:48:18
>>189
それは質問の答になってないね。
194仕様書無しさん:2011/01/29(土) 21:49:25
例外にしたってこの事象はどんな例外にするか設計はいるんだし。
195仕様書無しさん:2011/01/29(土) 21:51:30
>>189
だから、その設計に時間がかかるんだよ。

事実、関数ごとにエラーの値をどうするか違っているだろ。
関数ごとに違ったエラー処理を書かないといけないし、
もちろん関数ごとにエラー処理を書かないといけない。
まとめることができるエラー処理をまとめることもできない。
196仕様書無しさん:2011/01/29(土) 21:52:24
>>191
リソースの存在をチェックするとかリソースがない場合の処理とか
手続き型のビジネスロジックに条件分岐がないのはまれだと思うが。
思考停止して帰り支度をする「例外」的なのは困るだろ。
197仕様書無しさん:2011/01/29(土) 21:54:06
>>194
> 例外にしたってこの事象はどんな例外にするか設計はいるんだし。

どんな例外だろうが、例外を返すときに関数の戻り値の
型を考えなくてすむ。

たとえば、文字列を返す関数の戻り値に
エラーコードをどうやって混ぜ込む?
198仕様書無しさん:2011/01/29(土) 21:54:47
>>195
例外だって設計はいるだろ。つかそうじゃなきゃ例外を自分で定義する意味がねーよな。
199仕様書無しさん:2011/01/29(土) 21:54:57
>>196
> 思考停止して帰り支度をする「例外」的なのは困るだろ。

なんで?

戻り値だって、リソースが確保できなければ、
帰り支度するだろ。
200仕様書無しさん:2011/01/29(土) 21:55:24
>>197
戻り値、戻り値とは言うけれど、どうしても戻り値で渡せないなら、
引数にエラーコード受け渡し用の変数ポインタを持たせるなんて強引な手もある。
201仕様書無しさん:2011/01/29(土) 21:56:37
>>200
てか、C標準関数には引数に結果格納用の変数ポインタ渡して、戻り値はエラー専用とかいうのがあったような
202仕様書無しさん:2011/01/29(土) 21:56:38
>>198
> 例外だって設計はいるだろ。つかそうじゃなきゃ例外を自分で定義する意味がねーよな。

例外の場合は、例外の設計と戻り値の設計が分離されている。

だから例外の設計をするときに、戻り値の設計は不要。
もちろん例外を使っていれば、逆に戻り値の設計をするときに例外の設計は不要。

戻り値にエラーを混ぜ込む方法を考える必要がないんだよ。
203仕様書無しさん:2011/01/29(土) 21:58:08
>>197
だから、誰が例外はイラネ全部戻り値でやれっつてんだよw
例外も戻り値も使い分けりゃいいんじゃね?つってんだよ。
204仕様書無しさん:2011/01/29(土) 21:58:23
>>200-201
そう。それも例外がない場合の、エラーを返す方法の一つ。

戻り値の場合は、エラーを戻す方法が戻り値と分離されてないから
そのように、いくつかの方法を使う必要がある
実際関数ごとに違っている。

だから、関数ごとに個別対応が必要なりコストがかかる。
205仕様書無しさん:2011/01/29(土) 21:59:06
んだな。Cにはerrnoとかがある。
206仕様書無しさん:2011/01/29(土) 21:59:38
>>203
> だから、誰が例外はイラネ全部戻り値でやれっつてんだよw
> 例外も戻り値も使い分けりゃいいんじゃね?つってんだよ。

戻り値厨だろw
207仕様書無しさん:2011/01/29(土) 21:59:50
例外でもライブラリが違えば同じことだろ。
208仕様書無しさん:2011/01/29(土) 22:00:55
>>205
Cの場合、errnoをいちいち見ないと
発生したエラーがなにか具体的に分からないから
それも大変だよな。

errnoごとに処理が違ってくる。
209仕様書無しさん:2011/01/29(土) 22:02:24
なにをcatchするかとどこが違うのよw
210仕様書無しさん:2011/01/29(土) 22:02:51
>>204
例外使った場合も、戻り値でエラー判断しなくてすむわけじゃないし。
211仕様書無しさん:2011/01/29(土) 22:04:01
>>207
あんたが言ってるのは、ライブラリによってエラーの値が
違っているってことだろ?

ここで問題にしているのは、そのエラーの返し方。
例外を使っていれば、ライブラリが違ってもエラーの返し方とその取得の仕方は統一されてる。

Cのように、
・エラーコードを返す。
・true/falseを返す。
・NULLポインタを返す。
・引数でエラーを返す。
・戻り値はエラーを返すのに使って、計算結果は引数で返す。
・errnoというグローバル変数で返す。

のようにいろいろ分かれてることはないよ。
212仕様書無しさん:2011/01/29(土) 22:06:00
だからソレは設計の問題だと…
213211:2011/01/29(土) 22:06:07
さらに関数の中で関数を使用している場合、
たとえば、true/falseでエラーを返す関数で、
エラーコードを返す関数を使用していると困ることになる。

関数内では詳細なエラーが分かっても、
true/falseでエラーを返す関数からは
詳細なエラーを返すことができなくなってしまう。
214仕様書無しさん:2011/01/29(土) 22:06:09
例外の場合、何を例外にするかが決まってないから。
215仕様書無しさん:2011/01/29(土) 22:07:12
>>212
だから、その設計に時間がかかるだろ。

たかがエラーを返す方法ごときで
考える必要がある時点でおかしい。
216仕様書無しさん:2011/01/29(土) 22:07:46
>>213
おまえさんが例外を正しく使えないのはよくわかった。
217仕様書無しさん:2011/01/29(土) 22:08:02
>>214

話についていけてないならレスするなよ。

今話しているのは、エラーの値を何にするか(例外の型をなんにするか)
ではなくて、その決まった値をどうやって返すかって話だよ。
218仕様書無しさん:2011/01/29(土) 22:08:56
>>214
そういえばそうだったな。
別にオブジェクトである必要すらなかったんだな。
219仕様書無しさん:2011/01/29(土) 22:08:59
>>213
そもそも関数のユーザとしてはtrueかfalseかを知りたいんで、
エラーの内容を知りたいわけじゃないんだよね。
もしエラーが発生したらちゃんと処理してtrueかfalseにして返してくれ。
220仕様書無しさん:2011/01/29(土) 22:09:49
>>217
いや、そんな話してんの君だけだから。
221仕様書無しさん:2011/01/29(土) 22:10:06
>>216
また、反論がないね・・・

>>219
> そもそも関数のユーザとしてはtrueかfalseかを知りたいんで、
お前がture/falseが知りたいだけであって、
他の人は詳細なエラーを知りたいこともある。
222仕様書無しさん:2011/01/29(土) 22:10:59
>>220
じゃあ、今からその話をしようぜ。

ここで問題にしているのは、そのエラーの返し方。
例外を使っていれば、ライブラリが違ってもエラーの返し方とその取得の仕方は統一されてる。

Cのように、
・エラーコードを返す。
・true/falseを返す。
・NULLポインタを返す。
・引数でエラーを返す。
・戻り値はエラーを返すのに使って、計算結果は引数で返す。
・errnoというグローバル変数で返す。


さらに関数の中で関数を使用している場合、
たとえば、true/falseでエラーを返す関数で、
エラーコードを返す関数を使用していると困ることになる。

関数内では詳細なエラーが分かっても、
true/falseでエラーを返す関数からは
詳細なエラーを返すことができなくなってしまう。
223仕様書無しさん:2011/01/29(土) 22:12:07
>>221
他の人は詳細なエラーを知りたくないこともあるってことは思いつかないのか。
224仕様書無しさん:2011/01/29(土) 22:13:51
>>223
つまり、知りたいことも知りたくないことも両方あるってことだろ。
じゃあ、両方に対応できるようにしないといけないね。
225仕様書無しさん:2011/01/29(土) 22:14:23
例外を正しく使えないのに例外マンセーなのも笑える話。
226仕様書無しさん:2011/01/29(土) 22:15:32
>>213
だからと言って例外なら何でもスローして良いなんて話になるわけでもないでしょ。
227仕様書無しさん:2011/01/29(土) 22:15:58
かっこ良く(笑)いうと、戻り値だとエラーの返し方が統一されてないから、
関数ごとにエラー値のインピーダンスミスマッチが発生するということだね。(キリッ)
この解決にコストがかかるわけだ。
228仕様書無しさん:2011/01/29(土) 22:16:43
>>226
そんな話をしているのはお前だけだよ。
229仕様書無しさん:2011/01/29(土) 22:19:33
設計のマズさを戻り値の欠点みたいに言われても困る
230仕様書無しさん:2011/01/29(土) 22:20:16
だから、それでいいじゃん。
例外をうまく使う話にしようぜ。別に例外イラネってるわけじゃないんだから。
例えば、ユーザーからの入力が1,2しかないはずのとこ3がきたのを
例外じゃ処理しないだろ?
あるいはxxxx.datが指定されたけどありませんでした、これも例外じゃ処理しないよな。
じゃ例外で処理すべきなのはどんなことよ?
ぬるぽとかゼロ除算は当然そうだけど、DBのロックも例外だよなぁ。
これはファイルがないのとどう違うのよ。
とかさ。もうちょっと建設的な話したほうがいいんじゃね?
231仕様書無しさん:2011/01/29(土) 22:20:54
>>224
なんでお前の都合にあわせないといけないんだよw
232仕様書無しさん:2011/01/29(土) 22:21:27
バカが自分のバカさ加減を証明してるだけ。>例外イランってこのスレで頑張ってる奴
233仕様書無しさん:2011/01/29(土) 22:21:39
>>229
関数ごとに戻り値の型が違う以上、
それを統一的に扱える設計なんて存在しないよ。

自分で作った関数だけなら不可能ではないかもしれないが、
他のライブラリを使えなくなる。
234仕様書無しさん:2011/01/29(土) 22:23:46
>>233
戻り値でエラー通知するライブラリが存在しないわけでもないでしょ。
自分だけ例外使ってても、そういったライブラリと付き合わないといけなくなった時点で
その統一制は崩れ去る。
235仕様書無しさん:2011/01/29(土) 22:25:06
>>232
例外いらんとか言ってる奴いるか?
何でも例外ですまそうとする、例外を正しく使えないプログラマはいるみたいだけど。
236仕様書無しさん:2011/01/29(土) 22:26:21
戻り値しかない言語で、エラーの返し方を統一する方法としては、
戻り値をエラー値を返すだけに使うと決める方法があるね。

たとえば、WindowsのCOMのC言語による実装がそうなっている。
だけど、この方法を使うと、戻り値=エラーコードだから
int ret = foo(bar())
こんなコードがけけなくなるという欠点がある。
つまり、コストがかかる


WindowsのCOMの場合、直接C言語でCOMを書いたり使ったりってことは
あまりしないで、各言語のラッパーが、戻り値=エラーコードを
例外に置き換えることによって、C言語以外では
例外で処理できるようになっている。
237仕様書無しさん:2011/01/29(土) 22:26:35
もはや宗教だな。キモイ。
238仕様書無しさん:2011/01/29(土) 22:27:33
>>232
正しく使えてない知ったかの癖に馬鹿じゃないと思ってるやつを炙り出すためなら喜んで馬鹿になろう。
このスレにも散見されるが
239仕様書無しさん:2011/01/29(土) 22:27:45
catchすべき例外と、そうでない例外ってあるよね。
ぬるぽとかOutOfMemoryみたいなコーディングミスに起因する例外はデバッグ情報であって、
エラーハンドリングの対象ではないみたいな。
240仕様書無しさん:2011/01/29(土) 22:28:00
>>234
> 戻り値でエラー通知するライブラリが存在しないわけでもないでしょ。
いろいろ存在するってのはわかってるから、
ちゃんと例に出しただろw

Cのように、
・エラーコードを返す。
・true/falseを返す。
・NULLポインタを返す。
・引数でエラーを返す。
・戻り値はエラーを返すのに使って、計算結果は引数で返す。
・errnoというグローバル変数で返す。

で、統一されてないから、その処理方法を関数ごとに書くことになって
コストがかかるという話をしてる。

さらに関数の中で関数を使用している場合、
たとえば、true/falseでエラーを返す関数で、
エラーコードを返す関数を使用していると困ることになる。

関数内では詳細なエラーが分かっても、
true/falseでエラーを返す関数からは
詳細なエラーを返すことができなくなってしまう。

241仕様書無しさん:2011/01/29(土) 22:29:42
一行でも多く書くのをコストコスト言うバカがいるのはたしかだな。
242仕様書無しさん:2011/01/29(土) 22:30:25
>>239
> ぬるぽとかOutOfMemoryみたいなコーディングミスに起因する例外はデバッグ情報であって、

ぬるぽはともかく、OutOfMemoryはコーディングミスとは限らないぞ。
純粋にメモリが足りなくなって、処理ができないって場合もある。

だからってアプリを落とせばいいというわけじゃない。
なぜならマルチタスクなら他のプロセスを終了すればメモリは空くから。
243仕様書無しさん:2011/01/29(土) 22:31:12
>>241
その一行も、関数ごとに書かないといけないなら
二倍のコストになるよ。
244仕様書無しさん:2011/01/29(土) 22:35:20
屑レス量産してるお前のコードが一番コスト悪そうだが。
245仕様書無しさん:2011/01/29(土) 22:35:32
うむ。どうやらこれで
戻り値のほうがコストがかかるってことが
証明できたようだ。
246仕様書無しさん:2011/01/29(土) 22:36:52
>>240
とりあえずtrue/falseでエラーを返す関数の仕様変更からはじめようぜ。
エラーの表現能力が足りないとわかってるんだから当然だろ。
247仕様書無しさん:2011/01/29(土) 22:37:15
>>245
例外を正しく使いさえしなければ、な。
248仕様書無しさん:2011/01/29(土) 22:37:38
戻り値方式は戻り値だけでいいが、
例外方式は例外+戻り値だから、分が悪いな。
249仕様書無しさん:2011/01/29(土) 22:39:26
>>246
> とりあえずtrue/falseでエラーを返す関数の仕様変更からはじめようぜ。

例外を使うことにした。
その仕様変更は必要なくなった。


250仕様書無しさん:2011/01/29(土) 22:41:49
例外は無限の表現能力があるからなぁ。

どんなに頑張っても表現力に限界がある。
戻り値は分が悪いね。
251仕様書無しさん:2011/01/29(土) 22:42:21
>>249のようにエラーさえあれば何でも例外にして投げてしまおうなんて言う奴がいるので、
「どんな例外が飛んでくるか把握しきれない」などというアンチを生み出すことになる。
252仕様書無しさん:2011/01/29(土) 22:42:52
いっそ全部voidにしようぜ。
253仕様書無しさん:2011/01/29(土) 22:43:14
>>250
戻り値でオブジェクトや構造体返せば済むだけの話。
254仕様書無しさん:2011/01/29(土) 22:45:25
どんな例外が来ようが「適切な」実装をしとけばいいだけちゃうん
255仕様書無しさん:2011/01/29(土) 22:45:35
>>250
それがメリットだと思ってるところがレベル低すぎる
256仕様書無しさん:2011/01/29(土) 22:45:43
>>253
戻り値にエラーを混ぜるためだけに
戻り値の型を変更するなんて馬鹿らしい。

それにそんなことをすると int ret = foo(bar()) なんて
使い方が出来なくなると書いたろ。

たかが戻り値のエラーごときに、システム全体に
DQNな仕組みを採用したいのか?
257仕様書無しさん:2011/01/29(土) 22:47:03
>>254
俺の作った関数の例外はまったく同じ内容でも異なる型の例外が100個ある
もちろん将来的には違う内容にする見込みだからちゃんとcatchしてくれ
258仕様書無しさん:2011/01/29(土) 22:49:36
構造化例外があるくらいだから、いっそtry~catchだけ使ってifレスでコーディングするかw
259仕様書無しさん:2011/01/29(土) 22:50:15
>>257
try {
  リソース確保
  >>257が作った関数
} catch (Exception e) {
  何かする必要があればそうぞ
} finally {
  リソース解放
}
260仕様書無しさん:2011/01/29(土) 22:51:24
>>258
俺の作った関数の戻り値はまったく同じ内容でも異なる値の戻り値が100個ある

この場合でも大変だよな?
261仕様書無しさん:2011/01/29(土) 22:52:18
リソース解放で例外が出そうだなw
262260:2011/01/29(土) 22:52:45
>>257の間違い
263仕様書無しさん:2011/01/29(土) 22:53:43
>>261
C言語のfcloseでもエラー返すから、そのツッコミは意味が無い。
264仕様書無しさん:2011/01/29(土) 22:53:50
rand()はタイヘンだぁ
265仕様書無しさん:2011/01/29(土) 22:56:13
>>263
266仕様書無しさん:2011/01/29(土) 22:57:00
>>265
fcloseってのはリソース解放のことね。
そのリソース開放でエラーが起きたら
どうする?
267仕様書無しさん:2011/01/29(土) 22:58:31
例外が出るんじゃないのかw
268仕様書無しさん:2011/01/29(土) 22:58:53
C言語のfcloseの話だよ。
269仕様書無しさん:2011/01/29(土) 23:00:09
C言語にはtry~catchあんの?
270仕様書無しさん:2011/01/29(土) 23:01:05
>>266
そのfinally句で解放する予定だった他のリソース解放を継続させて、終了。

try {
  リソース確保
  >>257が作った関数
} catch (Exception e) {
  何かする必要があればそうぞ
} finally {
  try {
    リソース解放
  } catch (Exception e) {
    何かする必要があればそうぞ
  }
  try {
    他のリソース解放
  } catch (Exception e) {
    何かする必要があればそうぞ
  }
}
271仕様書無しさん:2011/01/29(土) 23:01:20
>>269
なんの話してんの?
272仕様書無しさん:2011/01/29(土) 23:02:46
そうぞは直した方がいいとおもうぞw
273仕様書無しさん:2011/01/29(土) 23:07:12
握り潰す前提で例外使おうとしてる人は正しいの?
274仕様書無しさん:2011/01/29(土) 23:07:55
C言語のfcloseでも同じだけど、
finallyで起きた例外は無視していいのか迷うね。

本来起きるはずがないことだから
起きてしまったら、何かしらのエラーかバグである可能性が高い。

コーディングミスで、本来解放すべきリソース以外のものを二度解放して
本来解放すべきリソースはそのまま残っているかもしれない。

そう考えると、fcloseでもちゃんと戻り値チェックをした方がいいかもしれないな。
275仕様書無しさん:2011/01/29(土) 23:10:42
>>274
それは、どう考えるか次第だね。
どの方法を使うにしろ、例外ならやろうと思った方をやれる。

だけど戻り値だと、すべてのfcloseにエラーチェックを入れなければ
いけないならコストがかかってしまうから、
ついコーディングミスなんてしないよ。
だからfcloseでエラーチェックは不要。なんて考えてしまう。
276仕様書無しさん:2011/01/29(土) 23:11:03
>>273
握り潰してるって、どれが?
finallyでリソース解放しようとして失敗した場合、
具体的にどんな回復処理をする?
まずは他の解放可能なリソースを解放するのが最優先だろ。
277仕様書無しさん:2011/01/29(土) 23:11:29
そういうのを無視していいための例外。コストがかからない(キリッ
って奴がいるから以下スレタイ、なんじゃね。
278仕様書無しさん:2011/01/29(土) 23:14:53
メモリリークなんてバグじゃないって主張する同僚みたいなもんだな
279仕様書無しさん:2011/01/29(土) 23:15:36
あと、落ちてなければバグじゃない。もよくある。
280仕様書無しさん:2011/01/29(土) 23:17:29
>>277
実際、もしfclose()を今時の言語で例外アリで実装するなら、
返り値はvoidで、close失敗したら例外を投げるだろ

それともcloseする箇所全部で返り値チェックしたいわけ?
281仕様書無しさん:2011/01/29(土) 23:32:07
だから、常識的にはfopenできたらfcloseすんじゃ?
282仕様書無しさん:2011/01/29(土) 23:33:27
>>201
なんの話してんだよ?
283仕様書無しさん:2011/01/29(土) 23:58:46
例の戻り値厨がいないと静かだなw
284仕様書無しさん:2011/01/30(日) 00:44:23
戻り値厨と例外厨しかいないこんな世の中じゃ
285仕様書無しさん:2011/01/30(日) 12:44:24
エラー処理と例外の区別がつかい人が沢山いるね。
例外は言語のみでサポートしている仕様ではない。
CPUがサポートして、OSがサポートした環境下での言語でしかサポート出来ない。

x86ならプロテクトモード対応のCPUとOS上でサポートされる。
まっOS自体を作る場合も例外はサポート出来るからOSは厳密に言えば必須とは違うが。
BIOSを作ろうと思えば例外はサポートされないから例外処理は適用出来ない。(エラー処理として実装する)

本来、CPUレベルのエラーを扱うのが例外だが最近は
プログラム(ビジネスルール)上のエラー処理も例外で行う人も良く見るようになった。
エラーを例外で扱う利点もある、例えば本体に正常処理のみの処理を書き
例外にエラー処理を宣言的に書くようにすればプログラムの可視化が向上する。

しかし、本来例外はプログラムのエラー処理ではない。
エラーで例外を発生させると、プログラムの流れが切断されいきなり例外処理に移動する。
これはgoto文プログラムと同様な弊害がある。

俺的には、エラー処理を例外処理で書くべきではないと思う。
286仕様書無しさん:2011/01/30(日) 13:08:16
>>285
> CPUがサポートして、OSがサポートした環境下での言語でしかサポート出来ない。

それは CPU 例外の話だね。

このスレで話してるのは C++, Java, Python, Ruby, ... あたりに組み込まれた
言語機能としての例外ね。

一般化するとこうなる。
http://en.wikipedia.org/wiki/Exception_handling
> ... exceptions, special conditions that change the normal flow of program execution.

言語機能としての例外はハードウェアや OS のサポートは何も必要としないし、
そもそもエラー処理に使われることを想定しているよ。
287仕様書無しさん:2011/01/30(日) 13:37:40
>>285
お帰りください。
288仕様書無しさん:2011/01/30(日) 13:59:44
たまに病気持ちが議論に入ってくるよねw
289仕様書無しさん:2011/01/30(日) 14:01:30
>>285
> エラーで例外を発生させると、プログラムの流れが切断されいきなり例外処理に移動する。
> これはgoto文プログラムと同様な弊害がある。

逆なんだよなぁ。
エラーが発生したから、
プログラムの流れを切断したいんだよ。

エラーが発生したのに、通常のプログラムの
流れを進むわけにいかないからね。

あと、どこでもいいからLinuxのカーネルのソース見てみgoto多用されているから。
これらは「エラーが発生したから、通常のプログラムの流れを切断する」ために用いられている。
http://git.kernel.org/?p=linux/kernel/git/next/linux-next.git;a=blob;f=kernel/audit.c;h=e4956244ae505e5fcd43df061395b3437a7e21b0;hb=HEAD

goto分完全禁止の時代は終わってね、今は例外処理の代わりとしては使ってOKの時代なんだよ。
290仕様書無しさん:2011/01/30(日) 14:04:39
どっちも馬鹿じゃね?エラー処理も含めてプログラムの流れだよ。
291仕様書無しさん:2011/01/30(日) 14:06:15
でもそのエラーが出たときの対処にも仕様があるでしょ?
エラーも含めて製品である限り、通常と例外に区別をつける必要がどうしてあるのか俺にはわかんね
仕様になければ例外なんて対応する必要ないだろ
292仕様書無しさん:2011/01/30(日) 14:11:07
>>290
> どっちも馬鹿じゃね?エラー処理も含めてプログラムの流れだよ。
通常(正常)時のプログラムの流れの話してるんだよ。

お前が言ってるのは、登山コースから外れても、
それも含めて道だ。と言ってるのと変わらんw
293仕様書無しさん:2011/01/30(日) 14:14:48
>>291
エラーが出ないときの処理・・・通常の流れ
エラーが出たときの対処・・・通常ではない流れ

と一般の人は考えててるだけの話。

お前の仕様書にも、「エラーが出たときの対処」と
仕様書からして区別して書かれてあるんだろ?
294仕様書無しさん:2011/01/30(日) 14:15:21
サイコロを振って1が出て欲しい時に1以外、2~6までの目が出る事がプログラム上で言う「例外」。
サイコロを振れば1~6のいずれかの数字が出る事は容易に予想がつく。

アンタは「例外」の意味を取り違えていると思う。
295仕様書無しさん:2011/01/30(日) 14:16:26
>>294>>292へのレスね。
296仕様書無しさん:2011/01/30(日) 14:16:50
> サイコロを振って1が出て欲しい時に1以外、2~6までの目が出る事がプログラム上で言う「例外」。

違います。

お前トリップ付けてw
297仕様書無しさん:2011/01/30(日) 14:19:35
>>294
サイコロを振れば1~6のいずれかの数字が出る事は容易に予想がつく。
というか、そういう仕様。

この場合に、ランダムな値を出すためにハードウェア乱数生成器(そういうハードがある)を
使っていたとして、その乱数生成器が物理的に壊れていて、ランダムな値を出せなかった。

この場合に発生させるのが、例外です。
298仕様書無しさん:2011/01/30(日) 14:20:55
if (!f()) { エラー処理 } と try {f();} catch(f_Exception() e) { エラー処理 }も対して変わらない。
もし、f()がf_Exception以外の例外を出すのだとすれば、それはバグ。
299仕様書無しさん:2011/01/30(日) 14:23:07
わかってないなあ>>296
300仕様書無しさん:2011/01/30(日) 14:24:27
何が例外かなんて仕様と設計と気分で決めるもの
301仕様書無しさん:2011/01/30(日) 14:34:00
>>299

わかってないのはお前で、
>>297が正解だよ
302仕様書無しさん:2011/01/30(日) 14:36:53
それだとぬるぽは例外じゃないってことか
ポインタにnullが入ってるかもしれないって、容易に想像つくもんね
303仕様書無しさん:2011/01/30(日) 14:38:31
>>297
でもその場合の対処が仕様書に書かれていれば
俺はその場合は例外は出さないな
(例:壊れている場合は「3」を使う等)
304仕様書無しさん:2011/01/30(日) 14:39:34
「サイコロを振って1~6を出す」関数で1以外が出るのは例外にしないほうがいい。
「サイコロを振って1を出す」関数で1以外が出るのは例外にしても悪くない。
305仕様書無しさん:2011/01/30(日) 14:39:36
>>302
ぬるぽは、ポインタにNULLが入ったときに発生する例外ではなく
ポインタにNULLが入っているのに、そのポインタを参照してメソッド呼び出しなんかを
したときに発生するものではす。

基礎的なところで間違えて変なことを言うから
お前の説得力がどんどん下がる。
306仕様書無しさん:2011/01/30(日) 14:40:21
>>303
> (例:壊れている場合は「3」を使う等)

使えないサイコロだなw
307仕様書無しさん:2011/01/30(日) 14:47:35
>>304
>「サイコロを振って1を出す」関数で1以外が出るのは例外にしても悪くない。

俺が言いたいのはつまりそういう事だ。
だからこそ「サイコロを振って1が出て欲しい時に」と言っている。
>>297はその辺を理解していない。
308仕様書無しさん:2011/01/30(日) 14:47:50
条件分岐と例外の違いみたいな話になってきたな
309仕様書無しさん:2011/01/30(日) 14:49:05
関数の仕様として、「戻り値は○○を返す。ただしエラーの場合には××を返す」などという
言葉を書こうとしたら、それは例外にした方がいいサインだろうな。

変数に二種類の値を入れるのは良くないのと同じように
戻り値として二種類の値を返すのは良くない。
310仕様書無しさん:2011/01/30(日) 14:49:53
>>307

「サイコロを振って1を出す」関数



「サイコロを振って1が出て欲しい時に」

は全然意味が違うだろw
311仕様書無しさん:2011/01/30(日) 14:52:15
>>307
> 俺が言いたいのはつまりそういう事だ。

あ、そういうことだったの?

つまり、>>294 は常に1しかでない関数の話をしていたのかw

それなら問題ないよ。
「サイコロを振って1を出す」関数というのは、
常に1しかでない関数の話だからね。
312仕様書無しさん:2011/01/30(日) 14:52:58
常に1しか返さない関数でエラーだの例外だの出されたらたまったもんじゃないな
313仕様書無しさん:2011/01/30(日) 15:02:21
「例外を出すのも仕様の内」だから>>297の説得力が正直微妙
314仕様書無しさん:2011/01/30(日) 15:05:22
>>312
じゃあ、エラーの時はどうするんだよw

エラーの時、何を返すかの話をしてるんだが、
ついてこれてる?

エラーが出るはずがないというのは論外な。
エラーが出る前提の話をしてるんだから。
315仕様書無しさん:2011/01/30(日) 15:07:05
>>314
エラーが発生したら内部で処理してくれ。
316仕様書無しさん:2011/01/30(日) 15:07:11
>>313
> 「例外を出すのも仕様の内」だから>>297の説得力が正直微妙

なんで?

例外を出すのも仕様なのはあたりまえだろう。
317仕様書無しさん:2011/01/30(日) 15:09:02
>>315
内部で処理できないエラーの話をしてるんだが。
お前本当に、ついてこれてないんだな。

これでやっとスタートラインにたてたか?

もう一度復習すると、
戻り値として1を返す関数で、
内部で処理できないエラーが発生した場合に
何を返すのかって話をしてるんだぞ。
318仕様書無しさん:2011/01/30(日) 15:12:09
>>317
内部で処理できないエラーを伝えられてもどうしようもないけどな。
319仕様書無しさん:2011/01/30(日) 15:14:12
>>318
たとえば、fopen関数は内部で処理できないエラーを返すけど、
何も出来ないというの?
320仕様書無しさん:2011/01/30(日) 15:14:22
>>286
OSやCPUが理解出来ていないみたいだね。
>このスレで話してるのは C++, Java, Python, Ruby, ... あたりに組み込まれた
>言語機能としての例外ね。
16bit時代のC++に例外機能がなかったのは何故か?
OSが32bitになってからいろいろな言語で例外機能が追加された理由は?
32bitで追加されたのはマルチタスク・マルチスレッドだけじゃないんだが。

>>289
>あと、どこでもいいからLinuxのカーネルのソース見てみgoto多用されているから。
>これらは「エラーが発生したから、通常のプログラムの流れを切断する」ために用いられている。
>goto分完全禁止の時代は終わってね、今は例外処理の代わりとしては使ってOKの時代なんだよ。
まさかLinuxのカーネルがgoto文使っているからgoto文は使って良いとは、どんな思考回路なんだ。
まっ自分で使うのは勝手だが、他人には強要するな。
321仕様書無しさん:2011/01/30(日) 15:15:14
戻り値で伝えていたエラーを例外に置き換えることは可能。その逆も可能。
322仕様書無しさん:2011/01/30(日) 15:16:06
>>320
> 16bit時代のC++に例外機能がなかったのは何故か?

あったよ。

反論終わり。

323仕様書無しさん:2011/01/30(日) 15:16:16
>>182
> 関数はすべて実行されるか、全く実行されないかの
> 二つの状態になるように作ればいい。
もうちょっと考え方を進めて、処理に成功したかどうかだけを教えてくれ。
詳細な失敗理由が必要なら後から参照するから。

っていう風には考えられないのかな。
324仕様書無しさん:2011/01/30(日) 15:18:20
>>323
なら、特定の関数が出す正規の例外には共通のベースクラスを継承させるようにするか
325仕様書無しさん:2011/01/30(日) 15:19:12
>>323
それをしようと思うと、グローバル変数が必要になるから
マルチスレッドで面倒。
326仕様書無しさん:2011/01/30(日) 15:19:21
>>319
どんなfopen使ってるんだよ。
うちのfopenは処理できなきゃ単にNULLが返ってくるだけのお利口さんだぞ。
327仕様書無しさん:2011/01/30(日) 15:19:54
ほらエラーの値としてNULL返してるじゃんw
328仕様書無しさん:2011/01/30(日) 15:20:04
>>325
オブジェクト指向知らないのか。
329仕様書無しさん:2011/01/30(日) 15:20:15
>>320
お前、自分の知らないことは存在しないとでも思ってるのか?
少しは Web 上の資料を漁ってソースを確認してから書き込むようにしてみろ。
330仕様書無しさん:2011/01/30(日) 15:23:13
>>328
C言語はオブジェクト指向じゃないよ。

C言語以外のオブジェクト指向は
言語の標準ライブラリからして例外を使ってる。

だから、詳細な失敗理由を後から参照とか
そういうやり方しなくていいんだよね。

ぶっちゃけ、このスレの戦いは、
C言語しか知らないやつ VS オブジェクト指向言語を知ってるやつ
の戦いになってる。

だから、たまにCPU例外の話をしたり、日本語としての例外の話をしたり
そういう、わかってないやつが出没してる。
ま、基礎知識の差が明らかにでてるね。
331仕様書無しさん:2011/01/30(日) 15:25:20
>>320に反論する場合、例外がハードやシステム寄りの機能であることはどうでもよくて、
例外がプログラムのフローをめちゃくちゃにするという主張を突っつくべきなんだよ。
「exit()は使うな。終了するときいはmainまで処理を戻せ(returnしろ)」みたいな話は確かにある。
throwはcatchしなければエラー情報つきexit()みたいな動きをするから、それに対して警戒するのは当然だろう。
332仕様書無しさん:2011/01/30(日) 15:25:41
ここでは関数呼び出ししか考えられない人が多いんだな。
オブジェクト指向な設計やってると、例外のいやらしさが身に染みて分かると思うんだけどな。
333仕様書無しさん:2011/01/30(日) 15:27:00
> 「exit()は使うな。終了するときいはmainまで処理を戻せ(returnしろ)」みたいな話は確かにある。

例外ってcatchしなければ、mainまで処理を戻してるんだが・・・
例外はexit()を使わないやり方、そのものじゃないか。

ちゃんと動作理解してるのだろうか?
基礎だぞ基礎。
334仕様書無しさん:2011/01/30(日) 15:27:52
>>332
ポリモするからどんな例外が飛んでくるのかわからないって話なら、それは設計がクソとだけ言っておこう。
335仕様書無しさん:2011/01/30(日) 15:28:56
>>332
それはお前が未熟なだけだよ。

なぜなら、各言語設計者や標準ライブラリ開発者は
よく理解しているわけだが、そういう人が
例外を使っているだろ。


例外を否定するというのは、言語を否定していることそのものだよ。
336仕様書無しさん:2011/01/30(日) 15:29:16
>>334
ポリモを否定すると、はっきり言ってオブジェクト指向のメリットの大半を
享受できないわけだが。
337仕様書無しさん:2011/01/30(日) 15:30:25
>>336
誰もポリモ否定してない。
個々の具象クラスが思い思いに独自の例外を飛ばす設計がクソ。
338仕様書無しさん:2011/01/30(日) 15:32:33
>>337
> 個々の具象クラスが思い思いに独自の例外を飛ばす設計がクソ。

安心しろ。どの例外もExceptionのサブクラスだ.

どんなサブクラスであっても、スーパークラスとして
処理できるのが継承の利点だろう。
339仕様書無しさん:2011/01/30(日) 15:32:54
>>337
だから、処理できないエラーが出たからといって例外投げずに
内部で処理してインタフェースどおりの挙動をしてくれと言っている。
340仕様書無しさん:2011/01/30(日) 15:33:43
>>339
関数内部で処理できないエラーがあることを知らないのか?

だからこそ、戻り値でエラーを返すんだろ。
341仕様書無しさん:2011/01/30(日) 15:34:13
>>338
ということで、あちこちで握りつぶしコードが量産されるわけだな。
342仕様書無しさん:2011/01/30(日) 15:34:46
>>340
おまえはwwwww
343仕様書無しさん:2011/01/30(日) 15:35:22
>>340
あぁ、言葉が足りなかったな。
インタフェースとして規定されている戻り値なり例外ならいいよ。
それ以外のことを考えさせるな。
344仕様書無しさん:2011/01/30(日) 15:35:34
>>341
正しい例外のやり方を知らないんだな・・・

Exceptionは捉えたら必要な処理をして、
正常な状態に戻すかそれができない場合は、
再throwするわけで、
握りつぶすのはお前だけ。

あちこちで握りつぶしコードが量産してるのは
お前だけ。
345仕様書無しさん:2011/01/30(日) 15:36:34
>>344
あちこちで例外捉えるコードを量産しないといけないのは変わりないね。
346仕様書無しさん:2011/01/30(日) 15:37:00
>>343
インターフェースとして規定されてない戻り値や例外ってなんだよ?

その例外をお前はなんで考えるんだ?

お前、自分で無駄なことをして自滅してないか?
347仕様書無しさん:2011/01/30(日) 15:37:45
>>345
それは、あちこちで戻り値のエラーチェックするコードを
量産するのと何が変わらないんだ?

お前が何を否定しているのかサッパリわからん。
348仕様書無しさん:2011/01/30(日) 15:39:29
>>333
例外投げっぱなしできちんと終了できるのって
スコープ抜けたらリソースが自動的に解放されるように徹底してる場合だけだよね。
349仕様書無しさん:2011/01/30(日) 15:42:59
>>348
リソースが自動的に解放されるというのが
なんか誤解してそうだが自動的に解放されないなら、
例外発生時にfinallyで手動で解放もできる。


で、それは置いといて、スコープ抜けたときにリソースが解放されてない関数が
戻り値でエラーを返していたら、きちんと終了できるとでも?

リソースが解放されない問題は、例外でも戻り値でも同じことだろ。
350仕様書無しさん:2011/01/30(日) 15:46:01
そもそも議論にならんのだよ。

C言語しか知らないやつは、例外のことをよくわかってない。
例外の存在を知っていたとしても、CPU例外と勘違いしているやつもいるし、
例外の正しい処理方法もわかってない。

だからかじった程度の知識のやり方をするから、
いろいろ欠点があるように見えてしまう。
が、それはC言語しか知らないやつが、単に未熟だから。

まず、未熟ということを理解してもらわなきゃいけないんだが、
変なプライドがあるんだろうな。
351仕様書無しさん:2011/01/30(日) 15:51:25
オブジェクト指向言語を知っているからといって例外の正しい処理方法が分かっているとも限らないが。
そういうのがプロジェクトに紛れ込むと大変ですね。
352仕様書無しさん:2011/01/30(日) 15:51:46
>>346
オブジェクトの作成者がtry-catchし忘れるだけで、簡単に漏れてしまうから
自衛するしかないという面もある。
353仕様書無しさん:2011/01/30(日) 15:57:59
>>322,329
嘘を書くな。
あるソースを出せるのか?出せないだろうが。
354仕様書無しさん:2011/01/30(日) 16:00:39
エラーに対するケアはエラー発生直近で行うのが原則。
離れれば離れるほど対処が難しくなる。
例外はエラーの発生源とそれを処理するコードを分離できる機能だけど、
正しく使えないと設計をわやくちゃにしてしまう諸刃の剣。
355仕様書無しさん:2011/01/30(日) 16:03:40
例外初心者がよくやる勘違いは、
catchしたら再throwするものではないと
思っていること。

まあどちらかと言えば、再throwしていいんだって
気付いていないってのが正解なのだろうが
catchして何かしらの終了処理をして再throwするのは全然おかしくない。

これがJavaとかだとfinallyがあるから、再throwする機会は少ないんだけどね。
356仕様書無しさん:2011/01/30(日) 16:11:56
>>353
http://www2.research.att.com/~bs/papers.html
> * A. R. Koenig and B. Stroustrup: Exception Handling for C++.
> Proc ``C++ at Work'' Conference. November 1989.

言語機能という見方では、古くは PL/I にさかのぼるらしい。
http://en.wikipedia.org/wiki/PL/I#On-Units_and_exception_handling

で、君の言う「16bit時代」っていつのことかな?
字面どおりの「16bit CPU が使われている時代」ってことだと未だに真っ只中になってしまう。
357仕様書無しさん:2011/01/30(日) 16:14:28
>>353
http://books.google.co.jp/books?id=8T0EAAAAMBAJ&pg=RA1-PA12&lpg=RA1-PA12&dq=%22Turbo+C%2B%2B+3.0+for+DOS%22+exception
&source=bl&ots=qCtYg07Vcv&sig=Xwat7FMjDW_0hy6UltJ428pi808&hl=ja&ei=sg9FTdKwCcGecaaC_fEN&sa=X&oi=book_result&ct=result&resnum=3&ved=0CCoQ6AEwAg

Turbo C + +3.0 will bring its low-end DOS product to conformity
with the ANSI and AT&T C+ + 3.0 specification, including support for templates and exception handling,
358仕様書無しさん:2011/01/30(日) 16:19:14
>>354
> エラーに対するケアはエラー発生直近で行うのが原則。

例外を理解していないものが勘違いすることの一つが、
catchがなければ、遠くに飛ぶから、
遠い場所でエラー処理をしなくてはいけないと思うこと。

たんにcatchすれば、次の行で処理できるのだから問題ないし、
例外は遠くに飛ぶのではなく、実行中の関数を異常終了させてりだけ。

その連鎖で遠くに飛んでいるように見えるだけで、
実は遠くになんか飛んでいない。
必要があれば必要なところでエラー処理を行える。
359仕様書無しさん:2011/01/30(日) 16:30:56
そういや、今でもuclinuxのような
H8マイコンのような16bit CPUで動く
Linuxがあるな。

もちろんLinuxなのでC++使えるし、
C++使えるということは、newが使えるということで
newは例外を発生する。つまり例外も使える。
360仕様書無しさん:2011/01/30(日) 16:52:16
catchの中で再throwした例外はどこに飛ぶのかな?
361仕様書無しさん:2011/01/30(日) 16:54:00
そりゃ呼び出し元関数だろw
returnして戻るのも、呼び出し元関数な。
362仕様書無しさん:2011/01/30(日) 16:58:14
へぇ
363仕様書無しさん:2011/01/30(日) 17:01:20
なるほどぉ
そうだったんだぁ
364仕様書無しさん:2011/01/30(日) 17:11:34
>>358
catchし忘れたら遠くに飛んでっちゃうじゃん。
365仕様書無しさん:2011/01/30(日) 17:14:35
>>356
それだと俺には分からんが?
具体的にどの製品がどのOSに対応したか書いてくれ。

>>357
>Turbo C + +3.0 will bring its low-end DOS product to conformity
>with the ANSI and AT&T C+ + 3.0 specification, including support for templates and exception handling,
だから、それが16bit環境で例外処理が出来ると何処に書いてある。

Turbo C ++なら
http://edn.embarcadero.com/article/33626
>Turbo C++ 4.0J for DOS[1995.4~、PC-9800シリーズ&DOS/V両対応]
>プロテクトモードで動作し、充実した機能を持つ統合開発環境をサポート。
>テンプレートや例外処理、実行時型情報などのC++機能、オプションの Borland PowerPack for DOS16と組み合わせて
>プロテクトモードアプリケーションの開発にも対応している。
>PC-9800シリーズとDOS/Vの両方で動作するライブラリや両機種用のTurbo Debuggerが標準添付されている。
この意味が分かるか?
>プロテクトモードで動作し
と書いてあるだろう。16bit時に例外処理が出来るのか?アホだろう?
ちゃんと調べて書けよ。
366仕様書無しさん:2011/01/30(日) 17:15:40
>>364
catchすれば遠くに飛ばないだろ。

return、returnの連鎖で遠くに行ったとしても
それを遠くに行ったとは言わないように、
例外で呼び出し元関数に戻って、
そこからさらに呼び出し元関数にもどったとしても
それは遠くに飛ぶとは言わん。
367仕様書無しさん:2011/01/30(日) 17:17:18
>>364
> と書いてあるだろう。16bit時に例外処理が出来るのか?アホだろう?

うん。uClinuxとかできてるよ。

それに、16bit CPUにもCPU例外機能は搭載されてるんだ。
お前は32bitでなんの機能が搭載されたと言いたいのかな?
368356:2011/01/30(日) 17:24:47
>>365
> 具体的にどの製品がどのOSに対応したか書いてくれ。

「16bit時代のC++に例外機能がなかった」に対して
えらく昔から C++ に例外機能があったことを示しただけだよ。
実装の歴史は情報が少なくてよくわからない。

で、君はハードウェアのどんな機能が C++ 例外処理の実装に
必要だと言うの?
369仕様書無しさん:2011/01/30(日) 17:26:48
こういうの不遜メソッドっていうんだってな。
370仕様書無しさん:2011/01/30(日) 17:27:58
>>361みたいなのがいる限り例外の使用は推奨できない。
371仕様書無しさん:2011/01/30(日) 17:28:00
>>365
たのむから、
プログラミング言語上の例外とCPU例外の区別ぐらいは
つくようになってから出直せカス
372仕様書無しさん:2011/01/30(日) 17:28:42
>>370
それ捨て台詞? 負け犬の遠吠え?
373仕様書無しさん:2011/01/30(日) 17:29:00
>>361
じゃなくて、より外側の例外ハンドラな。
374仕様書無しさん:2011/01/30(日) 17:31:32
>>373
そのとおり。
呼び出し元の関数ではない。
375仕様書無しさん:2011/01/30(日) 17:32:54
>>365
コンパイラの動作環境とコンパイルしたプログラムの動作環境との区別もついてないな。
376仕様書無しさん:2011/01/30(日) 17:51:03
>>367
>うん。uClinuxとかできてるよ。
それが言語なのか?OSと言語の区別もつかないとは、アホだろう。

>それに、16bit CPUにもCPU例外機能は搭載されてるんだ。
>お前は32bitでなんの機能が搭載されたと言いたいのかな?
お前は馬鹿か?言語の例外機構とCPU例外も区別が付かないのか?

早く16bit環境で例外が実装出来る言語を言えよ。アホ。

>>368
>「16bit時代のC++に例外機能がなかった」に対して
>えらく昔から C++ に例外機能があったことを示しただけだよ。
それは例外機構なのか、単純に例外処理が出来るだけのことを言っているのか?

>で、君はハードウェアのどんな機能が C++ 例外処理の実装に
>必要だと言うの?
自分で調べろ。

>>371
>プログラミング言語上の例外とCPU例外の区別ぐらいは
>つくようになってから出直せカス
アホ。区別がつかないのはお前だ。

>>375
>コンパイラの動作環境とコンパイルしたプログラムの動作環境との区別もついてないな。
いいから、16bitの動作環境で例外処理が実装出来る言語を言えよ。

お前ら、本当に知識がないな。
377仕様書無しさん:2011/01/30(日) 17:59:56
>>376
つ Smalltalk/V
378仕様書無しさん:2011/01/30(日) 18:10:29
>>376
> いいから、16bitの動作環境で例外処理が実装出来る言語を言えよ。

Java2MEとか、16bit CPUで動作するしほとんどのJava例外も実装している。

16bit時代の処理系という縛りで挙げても、
Adaとかmodula-2とかの現代的な言語の処理系は
例外処理を実装していたものが色々あったぞ。
379仕様書無しさん:2011/01/30(日) 18:21:31
例外なんて商用プログラムじゃ利用禁止が
普通だけどな

議論する意味もない
380仕様書無しさん:2011/01/30(日) 18:25:32
381仕様書無しさん:2011/01/30(日) 18:30:16
あのさ。横から失礼するけど
例外を正しく使えるか否かの話に戻せよ。

実際に例外を使わない奴はどうでもいいだろ。
そいつは、「戻り値を正しく使えないプログラマ多いね」ってスレでも立てとけ。

ここは、少なくとも例外を使うやつ専用スレだろ?
382仕様書無しさん:2011/01/30(日) 18:36:17
いや、ココは戻り値マンセーの馬鹿をオモチャにして遊ぶスレですけど…?
383仕様書無しさん:2011/01/30(日) 18:47:01
例外を正しく使えない例

if (error) {
    new RuntimeException();
}
384仕様書無しさん:2011/01/30(日) 19:21:55
>>383
いや、それはアリだろ。
戻り値とかグローバル変数でエラー情報を伝えてくるライブラリを利用するときなんか特に。
385384:2011/01/30(日) 19:22:38
>>384
グローバル変数を、スレッドローカルな変数に読み替えてくれるとうれしい
386仕様書無しさん:2011/01/30(日) 19:28:59
例外のスタックトレース機能も利用できるしな。
戻り値エラーを例外に置き換えたら便利になるよ。
387仕様書無しさん:2011/01/30(日) 19:30:08
いや、それどころか16bit初期のPANAFACOMのCAS BASICからして
EXXCEPTION SECTIONなる例外処理はあった。
どこで例外がそんなに新しいモノになったコトやら。
388仕様書無しさん:2011/01/30(日) 19:31:03
Cしか知らんおっさんはまさに老害だなw
389仕様書無しさん:2011/01/30(日) 19:33:40
実は>>361みたいな知ったかを燻り出すためのスレなんだ。
例外を正しく使えるプログラマばかりならば和解は可能だ。
390仕様書無しさん:2011/01/30(日) 19:37:45
>>376
> いいから、16bitの動作環境で例外処理が実装出来る言語を言えよ。

だから、g++だよ。
16bit LinuxのuClinuxで動くだろ。
391仕様書無しさん:2011/01/30(日) 19:38:33
>>389
じゃあ、その証拠に
「戻り値厨はこのスレからされ!」って
言ってみ。
392仕様書無しさん:2011/01/30(日) 19:39:51
そう。それが戻り値を使ったエラーの返し方な。
そのやり方には色々欠点があって、
単純にひとつの変数に正常な値・エラー情報の
二つを混ぜるってだけでもいけないんだが、
関数によって戻り値の方が違うから

C言語の標準ライブラリのようにエラーの値として
・-1を返す。
・0を返す。
・エラーコードを返す。
・true/falseを返す。
・NULLポインタを返す。
・引数でエラーを返す。
・戻り値はエラーを返すのに使って、計算結果は引数で返す。
・errnoというグローバル変数で返す。

で、統一されてないから、その処理方法を関数ごとに
書くことになって コストがかかる

さらに関数の中で関数を使用している場合、
たとえば、true/falseでエラーを返す関数で、
エラーコードを返す関数を使用していると困ることになる。

関数内では詳細なエラーが分かっても、
true/falseでエラーを返す関数からは
詳細なエラーを返すことができなくなってしまう。

393仕様書無しさん:2011/01/30(日) 19:40:54
>>383
if (error) {
new ごらごらException(error);
}

///
あとで、errorの中身が分からんと困るかもしれんので、errorぐらい入れてほしい。
あと、RuntimeExceptionだと一般的すぎるから、もう少し限定してくれや
394仕様書無しさん:2011/01/30(日) 19:41:24
いや、だからCしか知らないと言ってる奴でlongjmp知らないのがいるとは思えないんだが。
395仕様書無しさん:2011/01/30(日) 19:45:14
>>394
知らない人多いよ。
標準関数が戻り値でエラーを返しているから
そういう使い方があることに気づかない人が多い。
396仕様書無しさん:2011/01/30(日) 20:09:19
>>376
それはMac用か?
それなら、MC68000は内部アーキテクチャが32bitだ。

>>378
>Java2MEとか、16bit CPUで動作するしほとんどのJava例外も実装している。
具体的なCPUは?

>>380
それページから動作環境に移動するとこれが書かれているが。
>動作環境
>IBM PC/AT互換機(WindowsR 7, Windows VistaR, WindowsR XP, WindowsR 2000)

>>387
>いや、それどころか16bit初期のPANAFACOMのCAS BASICからして
>EXXCEPTION SECTIONなる例外処理はあった。
ミニコンなら実装されていてもおかしくない。

>>390
>だから、g++だよ。
>16bit LinuxのuClinuxで動くだろ。
CPUは?

お前らいまから、新人でもしっている事を説明してやるよ。
コンピュータは言語が直接動いているわけじゃなく
マシン語が動いているんだ。

だから、マシン語で動かせるものしか実行出来ない。
例外がマシン語レベルで対応していないCPUなら実装出来ない。
当たり前のことだ分かったか?

言語の例外機構がCPUに関係ないとか言ってたら新人に笑われるぞ。
397仕様書無しさん:2011/01/30(日) 20:14:53
>>396
別にお前の言うことが正しかったとしても
俺等別に言語やCPUにこだわって話してないのがわからないのか?
邪魔だからさっさとうせろ
育ちと頭の悪い奴相手にするの嫌なんだ
空気読んでくれない?
398仕様書無しさん:2011/01/30(日) 20:29:10
>>396 >>375
H8 で IBM PC/AT 互換機とか、おかしいと思わんのか?
399仕様書無しさん:2011/01/30(日) 20:35:20
>>391
まだ気付かないのか。
ターゲットは最初からお前だ。
400仕様書無しさん:2011/01/30(日) 20:39:33
>>396
ミニコンならなぜ実装されていてもおかしくないんだ?
401仕様書無しさん:2011/01/30(日) 20:55:50
さすがにわざとだろこれは。
402仕様書無しさん:2011/01/30(日) 20:58:47
>ttp://www.rrsoftware.com/html/prodinf/janus83/other/msdosc.htm#top

DOS用のAda83コンパイラもあるんだが。
403仕様書無しさん:2011/01/30(日) 21:07:22
>>396
> お前らいまから、新人でもしっている事を説明してやるよ。
> コンピュータは言語が直接動いているわけじゃなく
> マシン語が動いているんだ。

つ VM
404仕様書無しさん:2011/01/30(日) 21:12:11
つか、例外がマシン語レベルで対応できないCPUってあるのかw
なんで対応出来ないのよ?
405仕様書無しさん:2011/01/30(日) 21:18:11
>>404
CPU例外と、言語が提供する例外が同一である保証は無い。
406仕様書無しさん:2011/01/30(日) 21:20:53
>405
それはどこをどう比べて同一だとか違うとか言えるのかな?
407仕様書無しさん:2011/01/30(日) 21:29:53
>>397
>俺等別に言語やCPUにこだわって話してないのがわからないのか?
俺はこだわっていないが、別に言語にこだわってもいいだろう?
お前の言っている”俺等”ってお前の仲間は誰だw

>>398
>H8 で IBM PC/AT 互換機とか、おかしいと思わんのか?
開発環境か悪い見間違えた、しかしそのC++は例外機構を実装しているのか?

>>400
>ミニコンならなぜ実装されていてもおかしくないんだ?
だから、何故最近の言語に例外機構が実装されているのか
その理由が理解出来れば、実装されていても当たり前だと思えるが。

>>402
>DOS用のAda83コンパイラもあるんだが。
それには例外機構があるのか? 
>It requires an 80X86 machine running MS-DOS and a hard disk.
本当に16bit環境"だけ"なのか? 80386とかは32bitだぞ。

>>403
>つ VM
もしかしてVMと答える奴がいるかなと思っていたが、本当にいるとはw
VM自体は何で動いているんだw マシン語以外でコンピュータが動くとでもw

>>404
>つか、例外がマシン語レベルで対応できないCPUってあるのかw
だから、マシン語が例外を処理するのと言語に例外機構を実装出来るのは別だ。
408仕様書無しさん:2011/01/30(日) 21:34:57
>>407
例外がないとAdaは名乗れないんだよ。ボク。

>だから、マシン語が例外を処理するのと言語に例外機構を実装出来るのは別だ。
ふーん、じゃ別に16bitじゃできないわけじゃないだろw
409仕様書無しさん:2011/01/30(日) 21:38:13
>>407
http://japan.renesas.com/products/tools/coding_tools/compilers_assemblers/h8_compiler/child_folder/h8_compiler_components_child.jsp
> 言語仕様
> ANSI/ISO規格に基づき、例外処理やテンプレート機能をサポートしています。
410仕様書無しさん:2011/01/30(日) 21:43:16
g++での例外処理はライブラリ関数によって実装されているらしいよ。
ソースはBinary HacksのHACK#38「g++の例外処理を理解する(throw編)」
411仕様書無しさん:2011/01/30(日) 21:47:51
CASのBASICが動いてたC-180のCPUはMN1610といって、国産の16ビットのハシリだよ。
>ttp://www.st.rim.or.jp/~nkomatsu/panafacom/MN1610.html
412仕様書無しさん:2011/01/30(日) 22:26:06
0除算はC++の例外ではcatchできない。(WindowsはOSのサポートがあるので知らん)
http://codepad.org/NuLKW17K

誰かがCPU例外が無ければ例外は実装できないって言ってるけど、
CPU例外が無ければcatchできない例外をC++は拾ってない。(Windowsは別)
「CPU例外が無ければ例外を実装できない」はガセ。
413仕様書無しさん:2011/01/30(日) 22:30:04
その前にCPU例外がないCPUってあるのかw
414仕様書無しさん:2011/01/30(日) 23:16:36
話は全く変わるが、>>407が例外を使うケースってどんな場合?
java限定で頼む。
415仕様書無しさん:2011/01/30(日) 23:51:35
>>408
>例外がないとAdaは名乗れないんだよ。ボク。
だから、それは本当に16bit環境で動いているのか。

>ふーん、じゃ別に16bitじゃできないわけじゃないだろw
だから、マシン語の例外と言語の例外機構の違いが分からないのか?

>>409
http://documentation.renesas.com/jpn/products/tool/j702137_h8s.pdf
これを見ると例外処理は制限されているように思うが。
実際に例外処理を書いて動かしたのか?

>>410
本当に16bit版で例外が実装出来るのか知りたいんだが。

>>414
>話は全く変わるが、>> 407が例外を使うケースってどんな場合?
>java限定で頼む。
java自体を使わない。


話を整理するとだな、どのCPUでも例外処理は出来る。
しかし、言語に例外機構を実装出来るのはCPUやOSを限定する。
OSを使わないでプログラム単独で実行されるものは別。
インテルなら8086よりあとのCPU上で動く言語に例外機構を実装されている。
モトローラならMC68000以降。
基本的にはマルチタスクが出来るCPUなら例外機構が実装出来る。
つまり例外とは割り込み処理だ他のタスクに影響を与えないような
保護機能が備わっているCPU上で実装されている。
416仕様書無しさん:2011/01/30(日) 23:57:26
>>415
ならC++でも何でもいいけど、言語レベルでの例外を使うケースについて説明してくれ。
あと、俺はマジでCPU例外を知らないので、そこはスマン
417仕様書無しさん:2011/01/31(月) 00:18:16
>>415
基本的な言語レベルでの例外に対する考え方は>>285
例外として扱うケースは
・リソース不足
・ファイル制御
・外部モジュール制御
こんな感じで、自分のコントロール範囲以外のものをやる。
ゼロ除算なんかは本来はCPU例外だが、判定出来るからエラー処理。
418仕様書無しさん:2011/01/31(月) 00:21:55
> インテルなら8086よりあとのCPU上で動く言語に例外機構を実装されている。

つまり16bit CPUなら例外機構を実装できる。
419仕様書無しさん:2011/01/31(月) 00:23:59
>インテルなら8086"よりあと"のCPU上で動く言語に例外機構を実装されている。
>モトローラならMC68000"以降"。
日本語。
420仕様書無しさん:2011/01/31(月) 00:25:06
つまりまとめると、
結局のところ、例外というのはlongjmpを駆使して
実装できるわけだから、longjmpが使えるのなら
例外も実装できるってことだね。

CPU関係ないじゃんw
421仕様書無しさん:2011/01/31(月) 00:26:44
> インテルなら8086よりあとのCPU上で動く言語に例外機構を実装されている。

8086よりあとのCPUとは
8088 ・ 80186 ・ 80188 ・ 80286だ
これらは16bitであるため

つまり16bit CPUなら例外機構を実装できる。
422仕様書無しさん:2011/01/31(月) 00:31:00
割り込みがないCPUってあるのかw
423仕様書無しさん:2011/01/31(月) 00:32:22
なにからナニを保護してるのかさっぱりだな。
424仕様書無しさん:2011/01/31(月) 00:33:01
>>415
ドキュメントのバージョンが古い。なんで [旧製品] のやつだけ挙げるんだ。
日付 1998 とか見ても明らかだろ。

最新はこっち。
http://documentation.renesas.com/jpn/products/tool/rjj10j2552_r0c40008xsw07rum.pdf
425仕様書無しさん:2011/01/31(月) 00:35:41
つか、例外の実装なんてlongjmpでできるだろ。
longjmpが使えるのなら、CPU関係なく
実装できるに決まってるじゃん。
馬鹿じゃねーの?
426仕様書無しさん:2011/01/31(月) 00:37:58
>>285 に対して 30 分も経たないうちの >>286 で FA だってのに、おまえらときたら。
面倒見良すぎだろ。
427仕様書無しさん:2011/01/31(月) 00:38:16
例外は割り込み処理が備わっているCPU上で実装されているっていうけどさ、
割り込み処理が備わってないCPUなんてねーだろ?
なにいってんだこいつ。

8086の割り込みコントローラはIntel 8259 って書いてあるぜ。
428仕様書無しさん:2011/01/31(月) 00:39:37
>>427
騙されるなw
言語の例外処理機構の実装にCPU例外は関係ない。当然CPU割り込みも関係ない。
429仕様書無しさん:2011/01/31(月) 00:39:57
ま、結局のところ

戻り値厨 = 例外を理解していない = CPU例外と勘違いしている = そもそもCPU例外もわかってない

完全に素人さんだったってことさw
430仕様書無しさん:2011/01/31(月) 00:43:02
あぁなんだやっぱりコストのバカか。
431仕様書無しさん:2011/01/31(月) 00:43:31
マジでCPU例外と混同してたの?
ネタだよね?…ね?
432仕様書無しさん:2011/01/31(月) 00:43:43
>>428
いや、わかってるよw

ただ、自分で言った言葉が矛盾していることにも
気づいていてないようだから指摘したまで。
433仕様書無しさん:2011/01/31(月) 00:50:23
なんだかんだ言って親切なマ板は健在だな
434仕様書無しさん:2011/01/31(月) 00:53:27
割り込みが無いCPUってあるのか?って思ったら、
一応あるんだなw 4bit CPUには割り込みが無いものがあった。

http://www.itofamily.com/ito/collections/legend/i4004/index.html
> i4004 には割り込み機能がありませんでした。
> 割り込み機能は、最初の8bitプロセッサ i8008 や i4004 の改良型である i4040 で付きました。
435仕様書無しさん:2011/01/31(月) 01:03:44
ナルホド何にでも例外はあるもんだなw
436仕様書無しさん:2011/01/31(月) 01:41:04
お前ら本当に馬鹿だな。
お前らの好きなMSやBorlandのC++になぜ16bit環境では
例外処理が実装されいないんだ?

少しは頭を使えアホが。
437仕様書無しさん:2011/01/31(月) 01:42:25
はぁ?
438仕様書無しさん:2011/01/31(月) 01:45:43
俺が思うに、MSやBorlandのC++になぜ16bit環境で
例外が搭載されていないのは、CPUに割り込み処理がなかったからだな。

>>436
と間違ったことを行って恥を書いた人?
439仕様書無しさん:2011/01/31(月) 01:59:33
>>438
>例外が搭載されていないのは、CPUに割り込み処理がなかったからだな。
アホか?CPUの仕組みくらい勉強しろw
俺が言っているのは言語の例外機構だ。
これだからアホは疲れる。
440仕様書無しさん:2011/01/31(月) 02:00:57
>>439
お前、落ち着いてレスをよく読んでみろよ。
441仕様書無しさん:2011/01/31(月) 13:49:45
>>436
> お前らの好きなMSやBorlandのC++になぜ16bit環境では
ルネサスさんカワイソス
442仕様書無しさん:2011/01/31(月) 21:48:28
おじいさんが現役だった頃は
ルネサスなんかなかったんじゃ
443仕様書無しさん:2011/02/01(火) 10:18:13
どうやって「言語の例外処理機構」とやらが実装されていると思ってたんだろうね。
444仕様書無しさん:2011/02/01(火) 10:23:35
たぶん、コンパイラがthrow文をゼロ除算命令にするとでも思ってたんだろ。
445仕様書無しさん:2011/02/01(火) 10:39:31
こんな論文があった。
>ttp://ci.nii.ac.jp/els/110002726063.pdf?id=ART0003014571&type=pdf&lang=jp&host=cinii&order_no=&ppv_type=0&lang_sw=&no=1296523714&cp=
コレによると、例外の実装法というのは表引き法・setjmp法・2返戻値法が
あるそうだ。setjmpだけかと思ってたよ。
三番目の2返戻値法は例外用の戻り値を用意して持ち回る方法みたい。
戻り値派バンザイだなw
いずれにせよ特別なハードウェアだか32ビットだかは必要ないことは確かだねw
446仕様書無しさん:2011/02/01(火) 15:41:04
>他のタスクに影響を与えないような保護機能
と言語の例外機構wってなんの関係があるんだろう。
447仕様書無しさん:2011/02/01(火) 15:50:04
どうも例の彼は
・ 高級言語での例外処理
・ ソフトウェア割り込み
・ マスク不可割り込み
・ 階層特権CPUでの特権例外
・ 階層特権CPUでの特権割り込み
の全てが同じものだと思っているらしい・・・
448仕様書無しさん:2011/02/01(火) 19:15:35
そこでググって箇条書きしてくるあたりが例のコストバカに似てるがなw
449仕様書無しさん:2011/02/01(火) 19:18:19
>429であわてて他人のフリをするってコトは、そこまでは自信があったのか?
それもコワイなw
450仕様書無しさん:2011/02/01(火) 19:23:36
つかこのパターンは、おじゃばだろ。
451仕様書無しさん:2011/02/01(火) 20:12:14
>>448
図星だっからレスしたんだよね
452仕様書無しさん:2011/02/01(火) 20:15:07
>>451
はい図星です。
453仕様書無しさん:2011/02/01(火) 20:19:17
>>445
>三番目の2返戻値法は例外用の戻り値を用意して持ち回る方法みたい。
>戻り値派バンザイだなw
内部の実装の話だから関係無い
一つの戻り値に混ぜることが重大な欠点だから
454仕様書無しさん:2011/02/01(火) 20:24:48
お、来たな例外厨w
455仕様書無しさん:2011/02/01(火) 21:33:32
>>454
お前誰だよ?w
456仕様書無しさん:2011/02/02(水) 03:00:19
例外厨ねえ
嫌例外のほうが少ない気がするんだけどw
457仕様書無しさん:2011/02/02(水) 09:42:07
勢いが落ちたな

>>460
お前ネタ振れ
458仕様書無しさん:2011/02/02(水) 13:47:27
はりきって「言語の例外機構」をアピールするバカがいないと盛りあがらないな。
459仕様書無しさん:2011/02/02(水) 15:20:08
あれ、例外ってC++やPL/SQLなんかもあるけど、ここで言う例外の大半は
ジャワのことでいい?
460仕様書無しさん:2011/02/02(水) 15:47:10
JavaかC++だろうな前提は
461仕様書無しさん:2011/02/02(水) 16:36:28
>>460
ジャワ 95%
C++ 5%
ぐらいの比率かな、俺の予想だけど
462仕様書無しさん:2011/02/02(水) 16:39:22
ジャワでは
try{どうせこんなコード書いているんでしょ
 try{
  try{
   try{
    try{
     try{
      try{
       try{
        try{
        }catch(exp e){
        }finaly{
        }
       }catch(exp e){
       }finaly{
       }
      }catch(exp e){
      }finaly{
      }
     }catch(exp e){
     }finaly{
     }
    }catch(exp e){
    }finaly{
    }
    try{
    }catch(exp e){
    }finaly{
    }
   }catch(exp e){
...省略
463仕様書無しさん:2011/02/02(水) 17:18:07
catchブロックが複数書けるの知らないんだろうか…
464仕様書無しさん:2011/02/02(水) 17:28:36
>>463
ん・
1.まず正常系のコードを必死に書く
2.やっと仕様どうりに動作するようになったので例外、エラー処理に思考を向ける
3.最初のアルゴリズムに影響がでるのが怖いので>>462のようになる
ちがうかな。こんな人多いよね
465仕様書無しさん:2011/02/02(水) 18:05:04
>>464
try句の多重ネストなんて精々2-3重までだろ
catch句の中では例外が発生するような粒度の機能はそうそう使わないし
finally句も例外が発生しそうなのは精々ネットワークリソースのclose失敗ぐらいかなあ

tryの多重ネストの実例作ってみてよ
466仕様書無しさん:2011/02/02(水) 18:13:29
>>463
複数書けたとしても、特定処理の例外だけキャッチしたいなら
ネストするしかあるまい。
467仕様書無しさん:2011/02/02(水) 18:28:38
>>462
なったなったw
468仕様書無しさん:2011/02/02(水) 19:10:54
つまらん。「言語の例外機構」みたいなマジなのがねぇとな。
469仕様書無しさん:2011/02/02(水) 19:22:04
それとキャッチする例外の粒度が問題だな
該当する例外をきちんと捕獲するようなコードをきちんと礼儀正しく書く人は
少ない

大体catch( Exception e ) でおおまかに捕獲するだけ
470仕様書無しさん:2011/02/02(水) 19:25:07
>>450
あれ!!
あの馬鹿、まだ生きているの?
471仕様書無しさん:2011/02/02(水) 19:28:57
ここでさんざん握りつぶす話が出てるのにいまさらなにが粒度なんだ。
粒度の機構でもあるのかw
472仕様書無しさん:2011/02/02(水) 19:38:37
例外の種類でなく、どこでエラーが発生したか知りたい場合は
462のようなコードになるな。
473仕様書無しさん:2011/02/02(水) 19:38:41
>>471
例外の階層ぐらいは使うだろカス
474仕様書無しさん:2011/02/02(水) 19:40:07
>>472
ならねえよ
深くてもせいぜい3段だ
475仕様書無しさん:2011/02/02(水) 19:41:16
つトレース
476仕様書無しさん:2011/02/02(水) 19:48:31
>>472
種類が必要な場合より、どこで発生したかの情報が欲しい場合がほとんどなんだよね。

>>474
ループや条件判断が無い簡単なコードなんだな。
477仕様書無しさん:2011/02/02(水) 19:53:02
>正しく書く人は少ない
だの言う奴に限って旗色が悪くなるとこっちへ擦り寄ってくるw
478仕様書無しさん:2011/02/02(水) 19:55:09
なんだ、じゃわうんこが沸いてきたな
479仕様書無しさん:2011/02/02(水) 19:57:28
>>476
おいおい、ループなんて書くと、エラーをスローして
ループの途中でreturnしちまうんでねえの
480仕様書無しさん:2011/02/02(水) 20:03:05
考えてみれば、例外のキャッチって
馬鹿なプログラマが論理的にエラーをハンドリングできないから
強制的にtryブロックで囲んで、なにかことがおこればエラーキャッチする
仕組みを作ったんだよな。つまり例外処理は例外なく「馬鹿対応仕様」なのだ
481仕様書無しさん:2011/02/02(水) 20:06:18
それなのに>>1ときたら、自分は馬鹿カテゴリにいるのも気づかず
例外を正しくとか・・・・

おい>>1 お前はエラー処理ができないから例外キャッチワールドに左遷された
ことを自覚せよ
482仕様書無しさん:2011/02/02(水) 20:09:44
>>476
どこで発生したのかを知るには、
深いネストのtry-catchではなくて、
同じネストレベルに並んだtry-catchだろ。

ループや条件分岐があっても同じ。
ネストする必要なし。

そんなこともわからないカスがプログラマとかやってんじゃねえよ
さっさとマやめて転職しろ。
そのほうがお前にとっても周囲にとっても幸せだ。
483仕様書無しさん:2011/02/02(水) 20:14:33
>>480
>「馬鹿対応仕様」
そうだよ。利口しかプログラム組めないんならアセンブラでもワイアードロジックでもやってりゃいいじゃん。
まさかCコンパイラは要るとはいわんだろなw
484仕様書無しさん:2011/02/02(水) 21:02:27
>>462は大げさだが、関数を多重ネストすれば結局同じことが起こる
特にJAVAはそれが顕著。

エントロピーが発散する前に、エラー処理をリファクタリングするべき
485仕様書無しさん:2011/02/02(水) 21:07:24
でましたね、リファクタリング地獄

一度動作したソースはごちゃごちゃいじならいが鉄則なのですが・・・
486仕様書無しさん:2011/02/02(水) 21:08:37
リファクタリングという名目下で発生するデグレード地獄の多重ネスト地獄
スパイラル それがジャワ
487仕様書無しさん:2011/02/02(水) 21:35:33
戻り値こそネストだろ、という奴は…でてこれんわなw
ジャワジャワ言ってるジサマに突っ込まないのか?
488仕様書無しさん:2011/02/02(水) 22:00:43
>>470
この板の人間ならアレ?ということを
えらそうに知ったかをこいて突っ込まれたあげく
意地になって全レスかましたうえに敗走する芸風は
なかなか他の奴には難しいと思うんだがw
489仕様書無しさん:2011/02/02(水) 22:38:26
戻り値厨が頑張って釣ろうと
してるのはよくわかってるよ。
自分で馬鹿な事言ってるってわかってるでしょ?
490仕様書無しさん:2011/02/02(水) 22:41:24
例外がどこで起きたかって話で思い出したけど、
__FILE__ や __LINE__ がなくても
例外が起きた行番号がわかるのも
例外の利点の一つと言えるかもね。
491仕様書無しさん:2011/02/02(水) 22:48:53
>>485
> 一度動作したソースはごちゃごちゃいじならいが鉄則なのですが・・・

リファクタリングというのは、動作したソースをいじるのではなく
ソースをいじるときにやるんだよ。

プログラムの改修などでソースをいじる時があれば、
どうせいじる訳だから、いじる箇所をリファクタリングするの。
492仕様書無しさん:2011/02/02(水) 23:27:07
はい、リファクタリングとテストは不可分である云々の議論禁止。
君たち、例外の話をしろ。
493仕様書無しさん:2011/02/02(水) 23:38:09
例外が起きたら、何をすればいいかわかってない人がいる。

例外が起きたら、使用したリソースの
後片付けをすればいいだけだよ。

だから、なんのエラーが起きたかは
あまり重要じゃない。
494仕様書無しさん:2011/02/02(水) 23:53:23
いや、重要だろ。
ファイル終了例外はファイルの終端までデータ読んだとして処理できるが、
読み込みエラー例外は処理を中断しないといけない。
495仕様書無しさん:2011/02/03(木) 00:09:18
ファイル読み込み終了で
例外は発生しません
496仕様書無しさん:2011/02/03(木) 00:18:17
>>495
EOF まで読むと例外投げる言語も結構あるんだけど…
497仕様書無しさん:2011/02/03(木) 00:41:22
java.io.EOFException
498仕様書無しさん:2011/02/03(木) 00:59:50
java.io.EOFException

入力の途中で、予想外のファイルの終了、または予想外のストリームの終了があったことを表すシグナルです。

この例外は主に、データ入力ストリームの終了を知らせるために使用されます。ただし、ほかの多くの入力操作では、ストリームが終了したときに、例外をスローせずに特定の値を返します。
499仕様書無しさん:2011/02/03(木) 06:55:52
思うに例外って後続処理飛ばすから、
致命的なエラー以外でスローすると危険だな。

いろいろな種類の例外クラス作れるけど、
無条件ジャンプという機構は同じだしね。
500仕様書無しさん:2011/02/03(木) 07:51:39
> 思うに例外って後続処理飛ばすから、
> 致命的なエラー以外でスローすると危険だな。

逆、後続処理飛ばすべき自体が起きたから
例外をスローするんだよ。

お前は例外の使い方を分かってない。

> いろいろな種類の例外クラス作れるけど、
> 無条件ジャンプという機構は同じだしね。

エラーの場合に途中でretrurnするのと同じ
501仕様書無しさん:2011/02/03(木) 08:48:08
>逆、後続処理飛ばすべき自体が起きたから
おかしくね?

例外をスローする関数はシステム全体の事をしらないだろう?
EOFがシステムにとって致命的かどうか、ライブラリ関数製作者が分かるわけがない。

だからライブラリ関数利用者は、一旦TRYで括って
戻り値に変換するような事を強いられるんだろ?
502仕様書無しさん:2011/02/03(木) 09:07:17
EOFの例外ってほんとうにダサイ仕様だよなあ
ファイルの終端って例外か? ファイルの一部であり、ファイルの最後の識別だろう
それを例外にするセンスってああた、ジャワうんこまるだしだなあ
503仕様書無しさん:2011/02/03(木) 09:10:12
つかEOFってエラーじゃないだろうに。
ファイルを読み終わったらEOFなんだから。
504仕様書無しさん:2011/02/03(木) 09:11:02
>>503
そう、それを例外に棚上げするジャワを設計した人がダサイ
505仕様書無しさん:2011/02/03(木) 09:11:13
>>502
>498
506仕様書無しさん:2011/02/03(木) 09:12:42
終了のシグナルならば SIG_EOFとかのシグナルだせばいいじゃんか
それをほとんどエラーの捕獲のためのキャッチの箇所で正常系を処理する
のがなんかへん
507仕様書無しさん:2011/02/03(木) 09:14:49
>>501
「~する」という仕様の関数がそれをできないとき、関数が単に return して
実行が継続するようなことは常に危険だと断定できる。

利用者は必要に応じて「TRYで括って戻り値に変換するような事」を
選択することもできる。

何もしなければ意図された動作ができていないという判断に基づいて
処理が中断されていくのが自然。「強いられる」などということは無い。
508仕様書無しさん:2011/02/03(木) 09:15:29
さらに言うならば
ファイル処理は{ } ブロック内で連続して完結したいのに
EOFが発生すると catch{ }ブロック内にむりくり移動をされられて
前に使っていたローカル変数がちゃらになっちまう糞仕様
509仕様書無しさん:2011/02/03(木) 09:15:36
それにしてもファイルポインタが外れたのをEOFExceptionとネーミングするのは
ダメダメだと思う。Javaはそんなの多いよね。
510仕様書無しさん:2011/02/03(木) 09:18:10
で、こんな基本的な糞仕様に縛られる>>1は? コメントを求める
511仕様書無しさん:2011/02/03(木) 09:22:35
>>508
ファイル終端に達した途端に常に EOFException が発生するとでも思ってるの?
そうならもう一度 >>498
512仕様書無しさん:2011/02/03(木) 09:24:53
たとえばInputSteam.read()は正常のEOF時は-1を返すからcatchには行かないけど、
それにしてもこの辺は確かに名前的に良くはないわな。
513仕様書無しさん:2011/02/03(木) 09:26:23
>>511
ファイル処理は
読んでいる途中で発生するエラーってほとんどないだろう
大体は、パスが不正でオープンできないとか
パーミッションが不正でアクセスできないとの読み出す手前で発生するエラー
が大半だろう
514仕様書無しさん:2011/02/03(木) 09:30:29
読んでいる途中でエラーが発生するケースは

TCPストリームがリセットされた
パイプが切断された

ようなときだろう。これを例外にするならば StreamException, PipeException
とかで捕獲するのがスジだと思うよ
515仕様書無しさん:2011/02/03(木) 09:43:16
あれ、read()って一回-1が来た後もっかい呼ぶとEOFException出るんだっけ?
516仕様書無しさん:2011/02/03(木) 09:50:23
メイン関数やメインルーチンで例外受けているようなところだと
些細な例外でもプログラム停止に陥るからな。

だから各所に例外を握りつぶすプロックを入れて
ある程度処理を流すようにする。
517仕様書無しさん:2011/02/03(木) 09:57:07
ジャワ糞はファイル処理もろくにやったことがないのがばればれだな
518仕様書無しさん:2011/02/03(木) 10:04:38
>>514-515
で、仮にそうだったとして、何が言いたいの?
まさかそんな経験則を元にしてその他のエラー処理を省くとか?
519518:2011/02/03(木) 10:05:45
ごめんアンカーミスった。 518 は >>513-514 宛て。
520仕様書無しさん:2011/02/03(木) 10:36:48
>>518
ええっっっっっっ
エラー処理を無視するやつってジャワ糞しかいないよ
521仕様書無しさん:2011/02/03(木) 10:38:30
じゃぁ何が言いたかったの?単に自分の経験を披露したかっただけなの?
522仕様書無しさん:2011/02/03(木) 10:39:42
>>521
いまあるがままの言語仕様とそのくせをきちんと見抜き、適切な
アルゴリズムを実装するのは>>521の仕事だよ。自分であらゆるレアケースに
対応できるエラー処理を考えてみてはどうかな
523仕様書無しさん:2011/02/03(木) 10:43:17
出来る人 どんなささいなことでも前向きに自分の問題と照らし合わせて
     前進できる人

出来ない人 なにがいいたいの?とか言い返すだけの>>521な人
524仕様書無しさん:2011/02/03(木) 10:45:01
ひとりごとだったらしいな。気にしないでいいよ。
525おじゃばさま:2011/02/03(木) 11:56:55
どうやら俺の出番のようだな
526仕様書無しさん:2011/02/03(木) 13:50:22
>>501
>例外をスローする関数はシステム全体の事をしらないだろう?

誰もシステム全体の話なんかしてないよ
関数内の話

関数は全体どころか親関数でさえ意識してはいけない
だから、関数から例外をスローしたらそのあとのことは考えない
だれがキャッチするとかはスローした関数からはどうでもいいことなんだよね

527仕様書無しさん:2011/02/03(木) 14:59:27
>>526
こういうマに限って、MyFuncExceptionとかスローする関数を作る
その後どうすりゃいいのかさっぱり分からない

これだからJAVA上がりのマは厄介だ!
528おじゃばさま:2011/02/03(木) 15:10:14
>>527
まあそういうなよ。俺みたいにジャワのえきすぱあともいるんだから。
529仕様書無しさん:2011/02/03(木) 16:16:51
>>527
わからないのはお前が馬鹿だから
マ辞めろ
530仕様書無しさん:2011/02/03(木) 16:27:05
出来る人 たとえ関数内部のささいな仕事でも、全体に及ぼす影響までイメージできる人

出来ない人 >>529な人
531仕様書無しさん:2011/02/03(木) 17:23:04
MyFuncExceptionとがゴミだろ。
関数使うのに余計なincludeさせるな。
532仕様書無しさん:2011/02/03(木) 17:26:55
このヒトたちCができるようにも思えないのはなぜなんだろ…
533仕様書無しさん:2011/02/03(木) 17:30:04
汎用ライブラリの関数を書いている時点で、
数年先に開発されるかもしれないアプリの全体の挙動への影響まで
お見通しのスゴ腕Cプログラマwがいるスレはここですか?
534仕様書無しさん:2011/02/03(木) 17:37:04
ぶっちゃけExceptionなんて全部スローしちまえば関係なし
535仕様書無しさん:2011/02/03(木) 17:40:07
正しい種類のExceptionを投げるのが大事なのであって、
そのExceptionをどう処理するかは例外ハンドラを書く側の話だよな。

関数書く時に全体への影響をイメージするのって、
構造化すらマトモにできてないってことじゃねーかw
536仕様書無しさん:2011/02/03(木) 19:55:19
>スレタイ
537仕様書無しさん:2011/02/03(木) 20:39:38
使い方が正しいのかどうかってどうやって判断/試験/確認すればいいの?
538仕様書無しさん:2011/02/03(木) 22:33:51
>>535 例外を投げのはおまえじゃねえーだろうw
それともUNIXのシグナルのように積極的にSIGを飛ばすのか?ジャワでw
539仕様書無しさん:2011/02/03(木) 22:34:33
またジャワ糞がわけの分からんこと言い出しましたね
540仕様書無しさん:2011/02/03(木) 22:53:37
java.sql ResultSet内の
getStringを例にしようか

String getString(int columnIndex)
throws SQLException
この ResultSet オブジェクトの現在行にある指定された列の値を、Java プログラミング言語の String として取得します。
パラメータ:
columnIndex - 最初の列は 1、2 番目の列は 2、... となる
戻り値:
列値。値が SQL NULL の場合、返される値は null
例外:
SQLException - columnIndex が無効な場合、データベースアクセスエラーが発生した場合、またはこのメソッドがクローズされた結果セットで呼び出された場合

とあるが、それぞれのエラーの時に perror(exp)とかの引数で
「columIndexが無効」とか「データベースアクセスエラー発生」とか
のエラー状態をきちんと出力してくれんかな。SQLExceptionでひとくくりに
大雑把にまとめたジャワの仕様もアバウトすぎるよな
541仕様書無しさん:2011/02/03(木) 23:38:44
自分自身が例外としてスローされる
そんなオチ
542仕様書無しさん:2011/02/03(木) 23:49:19
>>540
SQLStateとかErrorCodeでわかるだろ。
543仕様書無しさん:2011/02/03(木) 23:51:04
>>538
> >>535 例外を投げのはおまえじゃねえーだろうw
> それともUNIXのシグナルのように積極的にSIGを飛ばすのか?ジャワでw

飛ばすのはSIGじゃなくて、Exceptionだよ。
このふたつは違うものだよ。
544仕様書無しさん:2011/02/04(金) 00:03:41
>>535
そうなんだよね。

たとえばこんな関数があったとき
void foo() {
  try {
    bar();
  } catch (Exception e) {
    throw new MyException(e);
  }
}

関数ってのは自分の役割を果たせばいいだけなんで、
fooを中心に見た場合、送出したMyExceptionを誰がキャッチするかなんて、*意識してはいけない*し、
barから発生した例外をbarの中の実装コードのどこで発生したかも*意識してはいけない*

545仕様書無しさん:2011/02/04(金) 11:23:06
ところでおまいら、DbC(契約による設計)ってやってる?
546仕様書無しさん:2011/02/04(金) 13:32:53
あれだろ? 契約書貰ってから設計しろってやつ
547仕様書無しさん:2011/02/04(金) 15:27:44
>>544みたいな自分勝手で破壊的な例外処理さえ禁止できればなぁ

この際、
Exceptionクラスに後処理関数デリゲートでも持たせてみるか?
548仕様書無しさん:2011/02/04(金) 19:06:25
うまくいかなかった時の戻り値を最初に決めて、例外が起きずに最後まで
到達したら正しい戻り値を返す。

これだとダメなのか。 難しいな。 あまり深く考えたくないな。
549仕様書無しさん:2011/02/04(金) 19:41:56
言語の例外機構って結局なんのつもりだったんだろ…
550仕様書無しさん:2011/02/04(金) 19:57:54
>>547
そういうのはExceptionのかわりにContinuationでやれ。
551仕様書無しさん:2011/02/04(金) 20:00:07
>>545
できる範囲でやってる。
とはいえ、やはりEiffelみたいに言語仕様がDbCを意識してないと
効果が薄いよね。
552仕様書無しさん:2011/02/04(金) 20:08:39
例外の型とかイベント駆動のやつのイベントの型とか
そういうのを理解できないヤツって、どこにでもいるよね

Object型を格納できる共通例外クラスとかイベントクラスとか
仕様書は書けないくせにコードですら余計な説明が必要になる実装ばっかり
やだー(´;ω;`)
553仕様書無しさん:2011/02/04(金) 20:30:13
難読化がはやりだからしょうがないんじゃないの
554仕様書無しさん:2011/02/04(金) 20:53:22
例外の仕組みを理解できてないから、
「どこで発生するかわからない」「復旧できない」
みたいな頓珍漢なことを言い出すんだろうなー

メソッドの戻り値に不正を意味する値を返させるなんて方法だと
返せる一つの型に、複数の意味付けが必要になるから、
-1みたいなマジックナンバー的なフラグとかを受けた側で判定させるようになる
しかも復旧できない場合にも例外を使わないとなると投げる方法ができないってことだから、
判定→抜ける→判定→抜ける→判定→抜けるで、バケツリレーしながら情報を渡していくか、
みんなが使えるイケメン例外処理さんを用意して、みんながどっぷり依存せにゃならん、ってなってしまう

例外の場合、発生させた側が詳細を明示出来るし、
受ける側も自分が扱う必要のないブ男例外なら、無視してしまえばいいだけ
ちゃんと使い方さえわかってれば、いろいろと楽になる仕組みなのになー

まぁ呼び出す側呼び出される側、どっちも自分が作ってる場合しか考えれなくて
例外を使う理由がわからない、とかそのあたりのレベルで思考がスタックしちゃった結果なのだろうけれど…
555仕様書無しさん:2011/02/04(金) 20:55:30
そういや、よくあるマイナス値を異常を示すフラグといえば、
最近俺が途中参加で加わったプロジェクトにも、過去に
「-2がきたらどうするか? テストを ret < 0 でやってゼロ未満なら全部NGにしときゃいい」
みたいなアホな発想するヤツがいたらしくて、バグがずっとそのまま埋もれていて
そのせいで起きた(起きていた)不具合が原因で、俺が触ってたところで問題が出てきて
そのデバッグで、散々汚らしいなコードの解読作業(もちろん仕様書は作られてなくコメントもない)させられたわw
ほんともう爆発しろよ!
556仕様書無しさん:2011/02/04(金) 21:15:41
人が増えれば難易度も上がるでしょ。やる人がピン、キリだから
557仕様書無しさん:2011/02/04(金) 21:16:02
つか、例外禁止されちまったから、
もうこのスレとはさよならだ。
558仕様書無しさん:2011/02/04(金) 21:26:27
例外の使い方をろくに知らない人の共通点
-なっがいtry句しか見たことないし、そういう使い方をするものだと思い込んでいる
-例外は異常だから復旧できないと頑なに信じている
-ドキュメントは読まないし書かない
-呼び出すメソッドの意味や返す値発生する例外などを考慮せずコピペ余裕

今まで見てきた奴は、必ずひとつ以上当てはまる奴ばっかだった
559仕様書無しさん:2011/02/04(金) 22:13:00
まずは正しい例外の使い方を定義してくれ。
560仕様書無しさん:2011/02/04(金) 22:15:50
俺定義を押し付けられても困るけどな
561仕様書無しさん:2011/02/04(金) 22:22:17
呼ばれる側と呼ぶ側の連携が取れてないと、何やってもダメでしょ
562439:2011/02/04(金) 23:23:13
すまん、俺の認識が間違っていた。C++厨の言っている例外は
一般的な構造化例外じゃなくC++特有の例外だったんだな。

http://keicode.com/windows/vccpp_exception_handling1.php
http://keicode.com/windows/vccpp_exception_handling2.php
>今回は SEH と C++ 例外は別物である、というお話でした。
と書いてあるし、C++の規格も
http://ja.wikipedia.org/wiki/C%2B%2B
>コンパイラ開発者の裁量で決められる範囲を確保するため、C++標準化委員会は
>名前修飾や例外処理などの実装に依存する機能の実装方法を決定しないことに決めた。
「例外処理などの実装に依存する機能の実装方法を決定しないことに決めた」
つまり、C++の例外も規格的には準拠した仕様だと認められているようだ。

しかし
>strcpy(NULL,NULL) は以前みたように、アクセス違反例外を発生させます。しかしこれは C++ 例外ではありません。
この程度も例外として処理出来ない「C++の例外」と言うのは...

C++では昔のBASICやVBの「On Error」文レベルの処理を例外と言うんだな。
C++厨が例外でエラー処理をする理由が分かった。
563仕様書無しさん:2011/02/04(金) 23:38:13
Javaでぬるぽをcatchするのはいろんな意味で負けだと思う
564仕様書無しさん:2011/02/04(金) 23:51:00
っていうか、手を入れれない場所の潜在バグの暫定対応以外で
捕まえる必要なんてなくね。起きるのはアホなコードが原因なんだし

Javaといえば、せっかく throws あるのに、
throws Exceptionってしか書けないアホ奴はしねばいいとおもう

せっかく…、つっても、java は例外で返す必要もなさそうなレベルの割と無駄な
例外がいっぱいあるから、ないと手に負えなくなるんだろうけれどさー
565仕様書無しさん:2011/02/05(土) 00:57:25
例外って、そもそも期待されている結果を返すための処理を完遂できなかった場合に、
自身の後続処理が行えないから、例外として自分の以降の処理ぶっちでほうり投げるわけじゃん。

例えば、 getHoge() メソッドで Hoge くれつって呼ばれたのに、
Hoge を返せなかったから Hoge ではない null を返すのは、なんかちがくね。
Hogeが取れなかった場合に null が欲しいだなんてのは、
呼び出し元のご都合であって、呼ばれた側が知ったこっちゃない。そこまで面倒見る義理もない。

もちろん、事前に Hoge がないときは null を返すっていう仕様にするよって決まってるなら
それは正しい動作だから問題ない。だけどそれだと今度は、getHogeって名前がおかしいよね。
機能を正しく表す名前としては、getHogeOrNull なんじゃないのっていう。
//あくまでもたとえ話だかんな!変に端的に食いついたりしないでねミ☆

それに、Hogeを返せない理由が実は複数あり、何故 Hoge を返せなかったかを知りたくなった、
なんて仕様が後追加された場合、正常に処理できる部分には全く問題はないのに、
戻り値の型を弄ったり、渡された引数の参照を書き換えてみたり、最低限入出力のどっちかのI/Fを
見直したりする必要が出てきたりして、アホな話になってくるよね。OOP(キリッ)のくせに、変更に弱い作りになっちゃう。

そういうわけだから、期待された動作を完遂できなかった場合は、例外として処理するのが
プログラムのお作法として見ても正しいし、再利用もしやすいし、
呼ぶ側も最低限のエラーを処理することで無駄が減らせるってわけ。
コードを眺めたときも、if(ret==-1) recover(); if(ret==-2) return false; みたいな、魔法の数字がでてきたりせずに
例外の型名でなにが起きたかざっと推測できたりするから、高水準な言語っぽさも出る。キャーカッコイイ
566仕様書無しさん:2011/02/05(土) 01:04:02
>>565
別にそーじゃないようにも組めるし
長文の意味まったくないね!ね!
567仕様書無しさん:2011/02/05(土) 01:07:23
>>564
バグだから捕まえる必要はない(直せばいいから)というのは間違いではない。

だけど徹底的にテストしたところで、バグをなくすことは不可能という意見に賛成なら、
バグを検出するため(ログを取るなど)に捕まえる必要があるというのも理解できると思う。
またバグがあっても一部の機能が使えないだけに影響を抑える理由も理解できると思う。

この二つを満たそうとするなら、どんなコードでも例外が発生する
可能性があると仮定したコードを書くべきだし、
どの関数でも終了処理を必ずやってからリターンなり例外発生なり
してから終わるように作らないといけない。

すべての関数でもれなく正しいエラー判定を行って、正しいエラーフローを書かないといけない。
これをやった場合、戻り値だとすごく大変になるというのはわかると思う。
だけど、例外だと楽に書けるよ。
568仕様書無しさん:2011/02/05(土) 01:08:28
ところで、例外とエラー処理を一緒くたに語るのはある意味で間違ってるよね。
例外をエラーと判断して処理するか復旧するか、なんてことは、呼んだ側の責務の話であって、
それが例外を使う、というか投げ飛ばしたり捕まえたりする話とは直接は関連してくるわけじゃない。

だって、たとえ戻り値でエラーを意味する識別子を返していたって、
正常なのか異常なのかを判断して、ダメならエラーとして処理する必要はあるわけなのだし、同じこと。
だから、例外を使うことと、エラー処理がどうのこうのーって話は、別に関係はないと思うの。

あと、これは全くの私見だけど、例外を毛嫌いする人って
try
{
 処理A();
 処理B();
 処理C();
 処理D();
 処理E();
 処理F();
}
catch (Exception ex)
{
 switch(ex)
 {
  case 処理A例外:
   //処理Aの例外処理
  case 処理C例外:
   //処理Cの例外処理
   :
 }
}
みたいな、おっきいtry句を1回だけ用意するような使い方が、try/catch句の使い方だって思ってる人が結構多い。
そしてどこで問題が発生したかわからないけど、プログラムが落ちるよ!なんつって混乱してテンパってる気がする。
569仕様書無しさん:2011/02/05(土) 01:17:30
>>568
実際のところ、そういうコードを書くのはまれなんだけどね。
処理Aの例外処理と、処理Bの例外処理が違うってことはあまり無い。

ほとんどの関数ではこのパターン。

try
{
 リソース確保
 処理A();
 処理B();
 処理C();
}
finally
{
 リソース解放
}

解放すべきリソースがないなら(ローカル変数だけ使っているとか)
tryそのものが必要なくなる。

で、最終的に例外は処理復帰可能なチェックポイントでキャッチされ
エラーをログに出してから処理を復帰する。(場合によっては終了する)
エラーをログに出すだけだから、なんの例外かを知る必要はない。
例外の種類なんて処理を復帰させるか終了させるかの判断に使う程度。
570仕様書無しさん:2011/02/05(土) 01:26:05
というか、例外の種類が発生元で違うのを一緒くたにcatchとかアホやらず
try {
 処理A();
} catch (処理AException ex) { ry }
try {
 処理B();
} catch (処理AException ex) { ry }
 :
ってやれって話じゃねーの?
try-finallyとはまた別の話題じゃね

確かに例外を使いたがらないプロジェクトや、
try-catchすら禁止するようなプロジェクトだとそういうのも見る
とくに中華系絡むと多い。奴らドキュメント見ないからな
571仕様書無しさん:2011/02/05(土) 01:32:55
>>570
実際やってみれ分かるけど、
サンプルコードのような全体が小さいアプリ以外は
catchで例外種類ごとに処理することなんて無いよ。

デフォルトで関数を中断して親にエラーが起きたことを通知するので、
これ以外のことが必要な場合、つまり例外が起きても
関数を中断したくないという時にしかcatchは書く必要はない。
それはマイナーケース。

catchじゃなくてfinallyはリソース解放で使うけど、関数で使った
すべてのリソースを解放するだけなので
なんの種類の例外かなんて調べる必要がない。
ま、C++の場合はfinallyがないから catchで代用するしか無いけどね。
572仕様書無しさん:2011/02/05(土) 01:59:02
>>570
そうそう。そゆこと。
んで普段から例外持ってるメソッドコールしてるって意識がないから、
try書くクセとかもなくて、チェックかけずにParthしてこけたりとかよくやってたりする。
なんというか例外を特別視しすぎなんだよね。
あとは冗長メソッドを使いすぎたりする人も似たような事よくやらかしてるイメージ。
一本道で一番期待してる結果になる条件で動かす場合って、
そういう脇道にそれる系のコードには到達しないから、
単純に意識がむいてないんじゃないかなーと、思ってる。(´・ω・`)
573仕様書無しさん:2011/02/05(土) 02:02:57
例外ならtry書かなければ関数を中断してくれるから
まだましだけど、こいつらにC言語とか使わせると
何も書かないからエラーでてても、無視して関数実行させるからな。
574仕様書無しさん:2011/02/05(土) 02:08:33
もみ消さなくてももみ消せるから便利!
もみ消さないともみ消せないからめんどくさい!

戻り値派ってこの程度の発想なんだよな。わりとマジで
575仕様書無しさん:2011/02/05(土) 02:12:35
>>562
> 一般的な構造化例外じゃなくC++特有の例外だったんだな。

「構造化例外」は Windows 固有のもの。どちらかというと
C++ 例外のほうがまだ一般的。

> つまり、C++の例外も規格的には準拠した仕様だと認められているようだ。

意味不明。 C++ の例外は C++ の規格で規定されているもの。
準拠するも認めるもクソもない。

> この程度も例外として処理出来ない「C++の例外」と言うのは...

VC++ なら構造化例外用拡張構文を使うなり _set_se_translator を
使うなりすればいい。
576仕様書無しさん:2011/02/05(土) 02:20:32
例外、つかエラー処理と後始末は別の話だから
同じtry文のブロックにしない方がいいと思う。
リソース解放の類はfinally で処理するより
Goのdefer文形式とかC#のusingみたいな形で書けるといいのにな。
577仕様書無しさん:2011/02/05(土) 02:22:44
usingはいいよな
578仕様書無しさん:2011/02/05(土) 02:24:37
そういや前に4k行メソッドで例外が発生したことがあった。

Method4K {
  //中略
  reigaidashitaMethod();  //ここで例外
  //後略
}

んで、スタックトレースどうなってるだろうって見てみると、
Method4Kで、reigaidashitaMethodを呼んだとこ。

って書いてあるんだけど、Method4K内でreigaidashitaMethod読んでるとこが数十か所あって、ほとんど役に立たなかった。
例外の正しい使い方、誰か教えて。

どーすりゃいいの?
579仕様書無しさん:2011/02/05(土) 02:28:53
どーすりゃいいのって
スタックトレースに表示されている
行番号を見ればいい。
580仕様書無しさん:2011/02/05(土) 02:29:29
4kのメソッドを分解する。
581仕様書無しさん:2011/02/05(土) 04:51:40
try句を適切に設定しろ
メソッド丸ごとtry句にするような手抜きをするからそうなる
582仕様書無しさん:2011/02/05(土) 05:35:48
というかメソッドを分解しろw
できるだけ単機能なメソッドに分解してあげないと
例外処理も煩雑になるし、一つのローカル変数の影響範囲が広がりすぎて
どんどん手を入れるのが辛くなってくスパイラル
583仕様書無しさん:2011/02/05(土) 08:09:15
例外の型とやらを細分化するってことは、オマエは起こりうる全ての
種類の例外を想定できる神なんだろうな。

神ならプログラム書かずに直接世界に影響を与えたらいいのに。

なんでそうしないの? バカなの? 無能なの? 凡人なの?
584仕様書無しさん:2011/02/05(土) 08:27:42
>>583
マトモな設計がしてあれば、
モジュール毎にどのような例外が必要なのかは洗い出せるだろ。

実装時に必要になった例外については、個別に対処すればいい。
自分が投げる例外にマッチした例外クラスがあるかを探す。
なければ、どの例外クラスからサブクラスすればいいかを考える。

できないなら転職しろ。
585仕様書無しさん:2011/02/05(土) 08:28:33
>>583
すべての例外はExceptionクラスのサブクラスだから、
Exception用のコードを書けばいいんだよ。

それ以外の処理をしたい時だけ、特定の例外の型用の
コードを追加すればいいが、そういうことはあまりない。
586仕様書無しさん:2011/02/05(土) 08:46:46
>>584
>マトモな設計がしてあれば、
>モジュール毎にどのような例外が必要なのかは洗い出せるだろ。

想定外の事が例外として現れるんだろがハゲ


>>585
それがダメって言ってんじゃないの? 一部の バ カ は。
587仕様書無しさん:2011/02/05(土) 08:49:58
>>586
え?
投げられてもいない例外が飛んでくるってこと?
定義されてもいない例外が飛んでくるってこと?
そりゃ怖いなw

マジレスすると、
自分が書いているコードに意味がないような種類の例外は
全部スルーしてしまえばいい。
その例外に意味があるような部分を担当している奴が
対処すればいいんだよ。
588仕様書無しさん:2011/02/05(土) 08:59:10
マジレスすると
全部スルーすれば、ランタイムが最終的にcatchしてくれるから問題無し
589仕様書無しさん:2011/02/05(土) 09:00:27
           ____        ) 『 例外処理の中で例外出したらどうなるの?』っと、
        /⌒  ⌒\      )
      /( ●)  (●) \    )/⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y丶
     / ::::::⌒(__人__)⌒::::: \
    |      |r┬-|     |
     \       `ー'´     /
     ノ            \
   /´               ヽ                 カ
  |    l   l||l 从人 l||l      l||l 从人 l||l   カ    タ
  ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、.     タ
   ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))
      ┌┬┬┐┌┬┬┬┐┌┬┬┬┐┌┬┬┬┐
590仕様書無しさん:2011/02/05(土) 10:31:39
でもjavaだとcatchしないとなんか文句いわれた思い出あるんだけど
591仕様書無しさん:2011/02/05(土) 11:33:11
あほな>>565の言うマジックナンバーってあるときは必要

tcpコネクションのメソッド内で発生したエラーが

「例外が発生しました」じゃわかんねーつうの
ipアドレスが不正
アクセス先がリスンされてないサーバだった
ユーザ名が不正
パスワード不適合などひとつのメソッドでエラーの原因因子も多数ある場合は
どうするのかおしえてくれよ
592仕様書無しさん:2011/02/05(土) 11:34:46
Socket

public Socket(String host,
int port,
InetAddress localAddr,
int localPort)
throws IOException
ソケットを作成し、指定されたリモートポート上の指定されたリモートホストに接続します。さらに、このソケットは、指定されたローカルアドレスとローカルポートにバインドされます。
指定されたホストが null の場合、それは、アドレスを InetAddress.getByName(null) と指定するのと等価になります。つまり、それは、ループバックインタフェースのアドレスを指定するのと等価になります。

セキュリティーマネージャーが存在する場合、その checkAccess メソッドが、ホストアドレスと port を引数に指定して呼び出されます。この結果、SecurityException がスローされることがあります。

パラメータ:
host - リモートホストの名前。ループバックアドレスの場合は null
port - リモートポート
localAddr - ソケットのバインド先のローカルアドレス
localPort - ソケットのバインド先のローカルポート
例外:
IOException - ソケットの生成中に入出力エラーが発生した場合
SecurityException - セキュリティーマネージャーが存在し、その checkConnect メソッドがこの操作を許可しない場合
導入されたバージョン:
JDK1.1
関連項目:
SecurityManager.checkConnect(java.lang.String, int)
593仕様書無しさん:2011/02/05(土) 11:39:48
java.lang
クラス SecurityManagerでチェックするんだろう。クラスをまたいでメソッド呼び出して
チェックして、なにがOOだよ、糞手続ラップの塊の糞ジャワだな
そして新たな例外もこのクラスに存在する
ジャワ糞の考えだと、SecurityManagerで例外が発生したから今SecurityManager
を呼び出したメソッドの例外としてしらんぷりして呼び出し元にもどせばいいのか
594仕様書無しさん:2011/02/05(土) 11:41:37
それと-1 -2とかがマジックナンバーとかいってるが数値リテラルで書きっぱなし
なジャワ糞だとたしかにそうなるが
仕様書に明記してenumすれば問題なしだ
595仕様書無しさん:2011/02/05(土) 12:07:04
>>591
> あほな>>565の言うマジックナンバーってあるときは必要
おい、理由はどうした?w

> tcpコネクションのメソッド内で発生したエラーが
> 「例外が発生しました」じゃわかんねーつうの
お前例外知らないだろ?例外というのは、ちゃんと
例外の細かい理由まで教えてくれるんだが。

お前が言うのは、戻り値の場合によく見られる話だよ。
負の数値が返ってきたらエラー。
-1は○○、-2は△△、-3は□□。

ヘルプには数値ごとに理由を書いてあるが、
めんどくさくなって0未満なら全部
if(foo() < 0) {
 printf("エラーが発生しました");
 exit(1);
}
とか書いてあるのをよく見かける。
596仕様書無しさん:2011/02/05(土) 12:13:28
>>593
お前CPUの例外と勘違いしてるだろ?
例外が発生したら、SecurityManagerのメソッドが
非同期で呼び出されるわけじゃないぞ。

CPU例外だったら、今実行している関数とは無関係に
例外ハンドラが非同期で呼び出されるが、今話している例外ってのは、
関数の戻り値と同じだ。もちろん非同期ではない。

TCPコネクションを接続するconnectというメソッドがあったとしたら、
例外でエラーを戻すということの意味は、
接続エラーの時の戻り値が大変便利になったというだけの話だ。
597仕様書無しさん:2011/02/05(土) 12:16:44
>>591
多分、そういう情報をメンバに持つ派生クラスを作れって言われるだろうなw
598仕様書無しさん:2011/02/05(土) 12:22:50
まだCPU例外と勘違いしてるのか
ぶっちゃけネタだと思ってたがマジなのかよ
いい加減ちょっとは勉強してこいよ
599仕様書無しさん:2011/02/05(土) 12:26:00
>>597
この場合は例外の型を分けるべきだろ。
ネットワーク関係のライブラリの接続エラーと
ユーザー認証系のライブラリの認証エラーでは
例外の種類は違って当然

戻り値と同じことを考えるからだめなんだよ。
戻り値だと、int型などのまとめることしかできないからな。

ネットワーク系のライブラリが接続できないときに-1を返す
ユーザー認証系のライブラリでも接続できないときに-1を返す

一つの関数内で、ネットワーク系ライブラリとユーザー認証系ライブラリを
両方を使うとエラーが両方共-1だから区別がつかない。
だからエラー番号を置き換えないといけない。戻り値だと大変だね。

だけど、その大変さは例外には当てはまらないから、簡単に違う型の例外を発生できる。
戻り値が大変だからって、例外も同じことをしないといけないということではない。
600仕様書無しさん:2011/02/05(土) 12:34:00
>>594
C言語のenumは結局のところint型だから

# ↓擬似言語
enum ERROR{ ERROR_1, ERROR_2, ERROR_3}
enum ERROR e = foo()
print e;

などとやっても、結局数値しか表示されないんだよね。
だからデバッグ中にエラーコードを表示しても数値しかわからないから、
この数値はどんなときに発生するエラーなんだ!ってなる。

eをprintしたとき、 ERROR_1 という文字列が表示されて欲しいんだがね。

Javaとかではできることだけど。
601仕様書無しさん:2011/02/05(土) 13:09:55
Cのenumは最終的には使えん。
-1とか-2でいいんだよ。
そういう言語だし、それで理解出来ない奴は
Cプログラマ界に不要。
602仕様書無しさん:2011/02/05(土) 13:25:37
無駄な努力をすることが美徳と思ってる
体育会系プログラマは消えていいよ。
603仕様書無しさん:2011/02/05(土) 13:34:35
-1 -2はenum値に対応したperrorのようなヘルプストリングメソッドを作れば解決するだろう
ほんとうに馬鹿かよジャワ糞は
604仕様書無しさん:2011/02/05(土) 13:37:35
作らないといけないだろ。
一方例外は、すでに作られています。


それに、二つ関数の戻り値を安全に簡単に
混ぜる方法の解決策は出てないよね。
605仕様書無しさん:2011/02/05(土) 13:38:09
単純なことをなんでここまでまわりくどくできるか
本当にジャワ脳は不思議だ
606仕様書無しさん:2011/02/05(土) 13:41:50
public Socketの糞仕様もオーバロードの悪しき使い方の典型だな
コネクションソケットと非コネクションソケットを同じ名前で
オーバーロードしちゃってさw
それじゃあ発生するエラーも180度違うだろうと言いたいね
基本仕様が糞だからジャワ糞もうんこ脳みそになっちゃうんだろうねきっと
607仕様書無しさん:2011/02/05(土) 13:42:40
perrorのようなものが必要になるってことは
使いにくいということだし、
戻り値ごとにそんなのをいちいち作ってられない。

perrorをもっと発展させて、言語側で使いやすい仕組みを作ったのが
例外なわけで、

perrorを作ればいいじゃない → そうやって不便を解決したのが例外なんだよ。

ということ。
608仕様書無しさん:2011/02/05(土) 13:43:32
>>607
だけど基本仕様が>>606だからこまっちゃったねえ~
609仕様書無しさん:2011/02/05(土) 13:43:47
>>606
ようするに、UNIXのすべてのものは
ファイルであるという考えを否定しているのかい?
610仕様書無しさん:2011/02/05(土) 13:44:59
>>608
はぁ?
お前が馬鹿だからちゃんとした使い方が
わからなくて困ってるだけど。

何が困るのかちゃんと説明してみ
611仕様書無しさん:2011/02/05(土) 13:47:10
え・public Socketはジャワのクラスだすよ
それがなんでUNIXのディスクリプタの話に飛躍するのか
またまたジャワ脳なのですか
612仕様書無しさん:2011/02/05(土) 13:47:36
>>606
発生する例外は抽象化しているので
180度違ったとしてもそれはハードウェアの
話であって関係ない。

例外とCPU例外をごっちゃにしているやつは。
例外ごとに、違う処理をするんだ!
なんて思うだろうけどw
613仕様書無しさん:2011/02/05(土) 13:49:42
例外は戻り値の数値がもっと便利になって
数値だけじゃなくて、文字列や各種情報も
返せるようになっただけなんだから、

soketのオーバーロードとか、なんの
話てんだこの馬鹿はって
切り捨てていいと思いますよ。
614仕様書無しさん:2011/02/05(土) 13:51:35
>>591
> あほな>>565の言うマジックナンバーってあるときは必要
おい、理由はどうした?w

こいつジャワの糞業務アプリしか組んだことないからひとつの例を教えてやろう
メソッドが処理をした、ステータス分岐が多数でる場合もある
たとえばHTTPステータスだ
(あるときはreturn値)をアウトプットする場合もあるよ
ttp://www.asahi-net.or.jp/~ax2s-kmtn/ref/status.html
ジャワの業務アプリではこんなのねーよ、とか言われればそれまでだが
615仕様書無しさん:2011/02/05(土) 13:53:05
それはステータスコードであって
マジックナンバーじゃない。
616仕様書無しさん:2011/02/05(土) 13:55:19
>>615
だから -1 -2 でもリテラルで書けばマジックナンバーだろう
お前俺の言っている事が全く理解できてないのかよ
仕様書に明記してenum化する、またはdefineする
そうすりゃあステータスと同等だろう
617仕様書無しさん:2011/02/05(土) 13:56:25
単純なことをまわりくどくはできても
単純なことをシンプルに考えることが出来ないじゃわ脳たんでした
618仕様書無しさん:2011/02/05(土) 13:56:58
内部で使われてるだけのマイナーな数値だから
マジックナンバーなんだよ。
619仕様書無しさん:2011/02/05(土) 13:58:00
リターン値は呼び出し元にもどるだろう、内部で使うだけなら
ローカル変数だ
620仕様書無しさん:2011/02/05(土) 14:01:18
お前が作るメソッド内部に限定しているから
-1 -2 とかばんばん使っていいのか? それがOOか
リテラルを使うそして意味の無い -1 -2 -3...をメソッド内の処理分岐に
つかうのか・・ああもう馬鹿かと -1 -2 -3 は俺様が分かっているから
いいんだとでも言うのか
621仕様書無しさん:2011/02/05(土) 14:01:55
HTTPのステータスコードは404とか有名なものは
プログラマは誰でも知っているのが常識だから問題ない。

だがエラーコードなんて誰も覚えてないだろ?
-1がなんで、-2がなんとか覚えてるか?

だから使うな。
622仕様書無しさん:2011/02/05(土) 14:04:06
SocketExceptionという例外が発生しましたといえば、
ソケット関係だってわけるけど、
-1という戻り値が発生しましたじゃ、
なんのエラーかすらわからないな。

>>600のいうように、
数値から定数名を取得できないし。
623仕様書無しさん:2011/02/05(土) 14:05:21
>HTTPのステータスコードは404とか有名なものは

ぷっ、有名だといいのかよ
その有名な404も仕様として設計書(この場合はRFCだが)
最初に誰かが取り決めただけじゃねえの?

だから、そのシステムのある数値をきちんと意味づけすればいいだけと
いうシンプルな話をしているだけなんだけどねえ
あーーーーーくどいやつ
624仕様書無しさん:2011/02/05(土) 14:06:57
お前が作ったエラーコードが
HTTPステータスコードのように
有名になる自信でもあるのか?
625仕様書無しさん:2011/02/05(土) 14:08:11
>>624

お前救いようのない馬鹿だな
有名になれなきゃステータスの設計はできないのかよ
あーそうですか はいはい ジャワ糞
626仕様書無しさん:2011/02/05(土) 14:08:47
>>623
HTTPであっても数値ではなく、
定数ちゃんと使えよ能なし野郎
http://struts.wasureppoi.com/servlet/09_status_kind.html
302 SC_MOVED_TEMPORARILY リソースが一時的に他の場所に移動したこと、また将来の参照の際にはこのリソースにアクセスする元々の URI を依然として用いるべき
303 SC_SEE_OTHER リクエストに対するレスポンスを異なるURIから発見することができる
304 SC_NOT_MODIFIED リソースが利用可能で変更されていない
305 SC_USE_PROXY リクエストされたリソースへはLocationフィールドで指定されたプロキシを通してアクセスしなくてはいけない
307 SC_TEMPORARY_REDIRECT リクエストされたリソースが一時的に異なるURIに存在する
400 SC_BAD_REQUEST クライアントから送られたリクエストが文法的に間違っている
401 SC_UNAUTHORIZED リクエストがHTTP認証を要求する
402 SC_PAYMENT_REQUIRED 将来利用するために予約されている
403 SC_FORBIDDEN サーバがリクエストを理解したがリクエストを完了することを拒絶した
404 SC_NOT_FOUND リクエストされたリソースが利用可能でない
627仕様書無しさん:2011/02/05(土) 14:10:46
>>626
お前w 日本語理解不能なんだな
俺はは最初からenum化、追加してdefine化をきちんと伝えているし
設計書とのリンクも明記し続けているよw
628仕様書無しさん:2011/02/05(土) 14:15:17
>>627
それで?
629仕様書無しさん:2011/02/05(土) 14:15:49
ジャワ糞が逆ぎれしたようです
630仕様書無しさん:2011/02/05(土) 14:19:08
戻り値の問題はある(自作の)関数が、404を返したとして、
その数値がなんのエラーコードなのかわからないところだな。

たとえばログインをする関数があったとして、
ページが見つからないときは404を返す。
パスワードが違っていたときは、独自のエラーコード888を返す。

この関数は、HTTPのステータスコードと独自のコードを返します
なんてことをすると、数値からどっちのエラーなのかわからない。

例外だったら、HttpExceptionとMyExceptionのふたつで区別すればいいだけなのに。
631仕様書無しさん:2011/02/05(土) 14:20:25
どうでもいいけどjavaをジャワ()なんて書くのは全角数字を使う並に違和感あるな
ユニックスとかシー言語とかって書いてるようなもんだし
632仕様書無しさん:2011/02/05(土) 14:22:30
ところで、なんでこのスレこんなに伸びてんの? 過疎板のくせに生意気だぞ。
633仕様書無しさん:2011/02/05(土) 14:27:54
vを発音できない世代の奴なんでしょ
仕様や、言語のお作法として推奨されてることを好みで批判するような
偏った老害のようなマには、この手のことは一生理解できないことだし、しょうがないとおも
634仕様書無しさん:2011/02/05(土) 14:29:57
           ____        ) 『戻り値の範囲が-5以上の数値だったらどうするの?』っと、
        /⌒  ⌒\      )
      /( ●)  (●) \    )/⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y⌒Y丶
     / ::::::⌒(__人__)⌒::::: \
    |      |r┬-|     |
     \       `ー'´     /
     ノ            \
   /´               ヽ                 カ
  |    l   l||l 从人 l||l      l||l 从人 l||l   カ    タ
  ヽ    -一''''''"~~``'ー--、   -一'''''''ー-、.     タ
   ヽ ____(⌒)(⌒)⌒) )  (⌒_(⌒)⌒)⌒))
      ┌┬┬┐┌┬┬┬┐┌┬┬┬┐┌┬┬┬┐
635仕様書無しさん:2011/02/05(土) 14:32:40
大部分の言語で採用されている例外。よく使われている言語で
唯一例外が使えないのはC言語のみ

C言語を使っている人は古株が多い。自分の力に自信を持っている。

例外は多くの言語で採用されていることからも
戻り値でエラーを返すよりも、優れた機能であることは明白。

どんなにC言語で自信を持っていたとしても、そいつよりも優れた言語開発者が
戻り値エラーが使いにくいという反省から生み出した例外を否定することは無理。

自信を持っているやつが、理解出来ない例外をを
優れていると認められずに頑固に貼りつくからスレが伸びる。
636仕様書無しさん:2011/02/05(土) 14:39:33
ぶっちゃけ戻り値で、期待してる値とは別の意味がある識別子が返ってくるなんて仕様があった場合、
それを知るためにドキュメントを見るなら、発生する例外が何かを調べるのと手間は変わらん。
ましてやそれが自分が処理するべき内容じゃなくても
必ずチェックし判断し、問題があれば他に処理わたしてやらないといけないやり方なんて、
古臭い無駄なやり方強要されるのは嫌だわw

よく、例外じゃなにが発生するかわからないなんていいだす馬鹿もいるけど
そういう馬鹿が作ったメソッドが throws Exception みたいなあほな指定してるっつーオチじゃねーの
throws自体は便利だと思うけど、馬鹿とはさみは使いよう。馬鹿が手がけてるとウザいだけになるw

だいたい昨今の高級言語でコーディングしてたら、自分が手がけてない処理が
どんな例外を返すかくらいは最低限把握してないとまともなコードなんかかけねーよw
637仕様書無しさん:2011/02/05(土) 14:43:24
例外が発生したときにやる処理は

1.共通処理・・・関数でやった処理の終了処理(必要な場合)
2.特定の例外だけに適用する処理(必要な場合)

これぐらいなんだよね。
すべての関数は例外を返す可能性があると考えていれば、
あとは、特定の処理をしたい例外だけを見ていればいいだけの
簡単なお仕事で、ちゃんとしたエラー処理を行える。
638仕様書無しさん:2011/02/05(土) 14:59:56
別に仕様書か関数ヘッダにでも、正しい情報さえあれば、
例外だろうと返値だろうと構わんわ。
なんか異常系を追加するなら例外のが楽。

仕様が書かれてないなら返値の方がいい。
何が来るのか調べるのがダル過ぎる。

ていうか仕様書メンテしろよクソが。
仕様書が古いとか、無いよりタチ悪いわ。
639仕様書無しさん:2011/02/05(土) 15:01:43
> 仕様が書かれてないなら返値の方がいい。

へ?

仕様はありません。さてこの関数が0を返したとき、
それぞれどういう意味でしょう?

答えられるのか?
640仕様書無しさん:2011/02/05(土) 15:03:02
最近ちょっとjava触ってて、検査例外はそこそこ便利かなーって感じることもあったんだけど
> 19 仕様書無しさん[sage] 2010/11/11(木) 08:06:53
> .NETが検査例外使わない理由だってさ。まあごもっともだね。
>
> バージョニングとスケーラビリティという2つの問題があった。バージョニングのほうは、あるメソッドを最初に定義したとき、例外A,Bをスローするように
> していて、次バージョンで例外Cもスローするように変更されてしまうと、そのメソッドの呼び出し元では例外Cはハンドリングされていないことになる、
> という事態が起こってしまう。このように、バージョンアップのときに、APIを利用している側のアプリケーションを壊してしまう可能性があるためだ。
> スケーラビリティのほうは、システムが大きくなると、throwsに書かなければならない例外が指数関数的に増えてしまうためだ。
>
> それに開発者は例外処理を避けたがる。try catch を入れ子的に実装しなければならないかもしれないし、果てはthrows Exceptionとか書き出すし。
> そんな状況では、検査例外はアプリケーションをデグレードさせる原因にしかならない。

> 果てはthrows Exceptionとか書き出すし。
あるあるあるw
そりゃねーよって思ってドキュメントやソースおっかけてみたら、最終的には
 * @throws Exception XX処理のなかで例外が発生した場合
そのXXX処理は外部のライブラリだっていうオチだった

例外を正しく使えないプログラマ多いね。
641仕様書無しさん:2011/02/05(土) 15:10:12
あー、これは検査例外の問題で正しく使えないのとは別だったわスマンコ

まぁ大元のほうの処理に変更があったんなら、
それにあわせてなんかしら修正する必要があるってのは、
ある意味間違ってはないんだけどな
642仕様書無しさん:2011/02/05(土) 15:10:53
>>639
答える必要はない。

戻り値見なければいいんだからな。
それがC関数の基本だ。

どうしても戻り値を処理して欲しい時だけ、
関数作った人が解説するだろうからな。
643仕様書無しさん:2011/02/05(土) 15:11:18
>>635
ちがうってばさw
Cはアセンブラに毛が生えた低水準の言語。アセンブラほど無敵でなんでも
できるわけではないけど、ほぼアセンブラに近い実装が高級言語イメージで
できる。しかしエラー処理やらなんやらぜんぶ神経つかって作る必要がある。
蛆虫のように低レベルマが激増した時代にアドレスエラーとかエラーチェックを
正確にしないマが激増した。頭の良い開発者は
馬鹿用にOO仕様を作ろうと発起した。そしてジャワとエラー処理を簡略化できる例外
が実装された だよ
644仕様書無しさん:2011/02/05(土) 15:14:28
検査例外はあったら便利に使えるのかもしれないけど、
どちらにしろ、どこで例外が起きても大丈夫な作りにするので
例外を処理する必要がある箇所では、RuntimeExceptionが
発生したときにも同じ処理をしないといけない。

全部の例外に対応するコードを書くので
特定の例外だけ検査例外として特別扱いしたいってことが
ないんだよね。
645仕様書無しさん:2011/02/05(土) 15:15:07
TCPソケットの例を出した俺が意地悪いのだと思うけど
業務システムだと

「入力エラーが発生しました」 でいいんだろうねえ。だから
もうおちまい。ばいばい
646仕様書無しさん:2011/02/05(土) 15:16:02
>>642

> 戻り値見なければいいんだからな。
> それがC関数の基本だ。

うん知ってる。C言語ではよく
エラー処理をしてないコードが多い。

サンプルです。エラー処理してません。
そういうコードをコピペして使うのが
C言語・・・というかお前の基本。
647仕様書無しさん:2011/02/05(土) 15:16:56
>>643
ようするに、エラー処理で無駄な努力をしている俺は
頭がいいと考えているわけねw
648仕様書無しさん:2011/02/05(土) 15:18:01
>>645

> 戻り値見なければいいんだからな。
> それがC関数の基本だ。

ということなので、

C言語では
「入力エラーが発生しました」
すら表示されないで落ちるぞ。
649仕様書無しさん:2011/02/05(土) 15:20:32
>>647 馬鹿のための箱庭仕様の中でいくらがんばっても所詮箱庭盆栽の狭い世界限定

>>648 のような馬鹿が増えたため、C++/Javaなどが作られた
650仕様書無しさん:2011/02/05(土) 15:22:15
>>649

まさにこれだなw

> C言語を使っている人は古株が多い。自分の力に自信を持っている。
>
> 例外は多くの言語で採用されていることからも
> 戻り値でエラーを返すよりも、優れた機能であることは明白。
>
> どんなにC言語で自信を持っていたとしても、そいつよりも優れた言語開発者が
> 戻り値エラーが使いにくいという反省から生み出した例外を否定することは無理。
>
> 自信を持っているやつが、理解出来ない例外をを
> 優れていると認められずに頑固に貼りつくからスレが伸びる

651仕様書無しさん:2011/02/05(土) 15:30:47
ぶっちゃけ馬鹿のためっていうか、こまけーこと気にしないで
ゴリゴリ書いてけるから楽ちんになるってカンジなんだけどなー
ただ高級言語の例外処理すら理解できないようなのが
C言語とかやったらもっと酷いことになるだけ

このスレで正しく使えない奴ってのは、そういう人のことについての話だったんだけど
それを「俺はCが完璧に使える、例外は面倒くさい」、なんて言い出す
的外れ見当違いの頓珍漢なことを言い出す真性老害ちゃんが沸いてるからスレが伸びてるだけ
652仕様書無しさん:2011/02/05(土) 15:55:34
>>639
少なくとも呼び出し先の関数を読めば返り得る値は分かる、
って程度のもんだ。

値の意味まで分かるかどうかはその他のコードの
書かれ方によるし、何とも言えない。
関数名だけでも分かりやすく付けてあれば、
かなり把握できると思うよ。

程度の話で、仕様書が無い時点で泣きたくなるけど、
実際問題弊社じゃ泣いてる奴ばっかりだぜ。
論外だ、と言えない現実が辛いわ。
653仕様書無しさん:2011/02/05(土) 16:03:49
俺の知っている院生はすげえセンスの良いUNIX C使いだけどなあ
こいつにジャワやらせたらすぐできたよ。
院生「javaで何をつくれと・・・」
俺「何がつくれると思う?なにか提案してくれ」
院生「まず、javaでは何も作る気がおきませんね」
俺「理由は?」
院生「カーネルは組めないし、WebだったらPHPで十分だし、ネットワークもラップの仕様が
いいかげんだし、デバドラも作れないし、シェルでなんでもできるからjava hoge実行で
クライアントアプリもいらないし、正直使い物ならないですねえ、てかこれよろこんで
いじっている人っているんですか?」

と言っていた
654仕様書無しさん:2011/02/05(土) 16:05:04
>>640
>次バージョンで例外Cもスローするように変更されてしまうと、そのメソッドの呼び出し元では
>例外Cはハンドリングされていないことになる

結局、元の例外クラスが持ってないインターフェイスは実装しちゃマズイんでしょ。
で、元の例外クラスって、それ以上拡張する必要がないほど完璧なの?

ってことになる様な・・・

大した事出来ねーんなら、細分化しなくてもいいじゃん。 

それに、関係ない例外が自分の所までたらい回しで上がって来るって、
いかがなものかと。
そういう作り方って、推奨されてるものなの?
655仕様書無しさん:2011/02/05(土) 16:20:18
例えば、プロセスの初期処理でINIファイルを読むとする。
で、INIファイルは必ず存在することになっている。

戻り値)
openIniFile();
// 戻り値はあるが来ないので余裕で無視。ソースも見通しがよい。


例外)
obj.openIniFile();
// 例外はあるが来ないので無視したいが、tryで囲まなきゃだめ?
// 来ないことになっているので、仕方ないが手間掛けたくないので握り潰すコードいれよ。
656仕様書無しさん:2011/02/05(土) 16:27:32
>>655 いや、 try 要らないから。
657仕様書無しさん:2011/02/05(土) 16:28:57
>>655
Java の検査例外ですね。わかります。
658仕様書無しさん:2011/02/05(土) 16:35:47
そこでiniファイルが消失した場合は
ぐでぐでの初期値で動作するのかいな~
659仕様書無しさん:2011/02/05(土) 16:37:17
必ず存在する保証なんてないよなあ
新人のあほジャワ糞が hoge.iniってなんだ? これいらねえよなあ
rm -rf / [Enter] しちまうかもしれないし
660仕様書無しさん:2011/02/05(土) 16:37:35
Javaがはやったのは当時金のなる木だったからだろ
そのおかげで使えるにわかマが増えたのが現状
だから今の案件でも集めやすいJavaは多い
で、仕事で指定されてるわけだからそれを使う
それが仕様だから、好みの問題とか自分がやりたいことがやれないとかは関係ない

普通の趣味マが自分の趣味にJavaやろうなんて思うことはまずないしな
661仕様書無しさん:2011/02/05(土) 16:42:58
try要らないって言われても、誰かに文句言われることない?(ソースの品質管理の人などに)
そして、上位でもtry-catchやってるかどうか分からんのだよ?
もしかするとobj.openIniFileの中で、
勝手にファイルない場合の初期値で設定処理してるかもしれない。

上位も下位も何やってるか分からんから、
念の為にtryで括って握り潰すコード入れたくなるだろ?
662仕様書無しさん:2011/02/05(土) 16:45:43
>>661
「必ず存在する」が前提としてあるなら問題ないだろ。
前提に出来ないなら戻り値を使う場合のコードもダメだし。

> 念の為にtryで括って握り潰すコード入れたくなるだろ?

お前はそうかもしれんが他のまともに例外を使うプログラマはそうではない。
663仕様書無しさん:2011/02/05(土) 16:46:53
>>661
> try要らないって言われても、誰かに文句言われることない?(ソースの品質管理の人などに)

お前みたいな無知な奴に文句言われるんだろうなw
うぜぇ
664仕様書無しさん:2011/02/05(土) 16:50:56
「必ず存在する」というのはもちろんシステム条件だ。
プログラマ開発個人の環境ではいくらでも「無い」状態を作れる。

なのでとりあえずって感じでtryを入れる。
おまじないと同じよ。

以下と同じイメージだ。
int n=0; // オマジナイの初期値0
n = func();
665仕様書無しさん:2011/02/05(土) 16:54:36
必ずあるものが無いなら、無い旨通知する必要があるのではないかと。
で、ちゃっちゃと終わりの支度始めないと。
666仕様書無しさん:2011/02/05(土) 16:56:48
客「あれ?○○ってファイルが無いと動かないよ」
俺「そういう仕様です」
客「はぁ?それじゃあ困るよ。今すぐ直して」
俺「仕様変更ですね。追加料金で3万円頂きますが」

これくらいの交渉できるようになりたい
667仕様書無しさん:2011/02/05(土) 17:00:21
このあたり、認識の違いだよなぁ

> で、INIファイルは必ず存在することになっている。
こういったコード上で表現できない仕様を、そういうもんだで割り切っていいのは
趣味でやってる自分しか弄らないコードとかの話なんだけどな

もし想定していない(例でいうとファイルが存在しない)状況になった場合、
なにが原因であることかを突き止めるのって、意外と手間だったりするしな

結局求められてるものの要求レベルの話
PC上で行える操作がある以上、アプリケーション側が補償してやるか、
運用でカバーするので無視するかの違い

コードの見通し()なんてお門違いの話はどうでもいいよ
そういうこという奴に限って、インデントのタブ/スペース宗教にどっぷりはまってたり
ルール外の例外的なインデントで体裁をご丁寧に整えることに時間費やしたりするしな
668仕様書無しさん:2011/02/05(土) 17:00:35
いやいやw
ファイルが無いのは開発側の責任だからw
669仕様書無しさん:2011/02/05(土) 17:02:07
>>661
> 上位も下位も何やってるか分からんから、
> 念の為にtryで括って握り潰すコード入れたくなるだろ?

仕様というか責任範囲を明確にする努力をしろよ。
馬鹿か?
670仕様書無しさん:2011/02/05(土) 17:04:53
>>666
そんなんばっかやってると、次の仕事が来なくなる諸刃の剣だけどな

そうならないために、作る側が作る時点で
「こういうことが想定されるけど仕様にないです。どうするべきか追加してください。
また、エラーとする場合はどのような動作にしますか?エラーメッセージはどうしますか?」
みたいな仕様確認をしておくでしょ

仕様書に書いてなかったからやりませんでした。
が通用するレベルの程度の低い仕事ばっかなら楽でいいんだけどねw
671仕様書無しさん:2011/02/05(土) 17:12:10
ほう、すこしはまともな人もいるんだな>>670
672仕様書無しさん:2011/02/05(土) 17:14:29
デジタルデータを「絶対存在する前提」でコードを書くなんて
ジャワ糞丸出しだなあ、せめてファイルが無い場合は仕様できめた
デフォルト値で無理やりどうささせるとか。エラーログを出力するとか
障害時の切り分けをすみやかにできる仕組みは最低実装してくれよ
だから永遠のデバッグプロジェクトになっちまうんだよなあ==>ジャワ
673仕様書無しさん:2011/02/05(土) 17:20:19
よくできたプログラマーはそういう言語仕様の違いで例外に文句いったりしない
だって何故そうなったかまで理解してるし、言う意味がないことにも気づくから
その言語を使うってなったらその言語の決まりどおりに率なくこなすだけ

できないプログラマーはやれあの言語はこうじゃないから不便だの
その言語はこれができないだの、文句をいうのに口を動かすばかり
理解しないし、そもももできない

例外に文句言いにスレにきてるのは後者ばっかだから、いつまでも平行線なのはしょうがないよ
674仕様書無しさん:2011/02/05(土) 17:24:57
>仕様というか責任範囲を明確にする努力をしろよ。
隣にいるとは限らんしな。
上は中国かも知れんし、下は南朝鮮かもしれん。
もう退場した奴の担当かもしれん。

綺麗な環境しか想定できないのは所詮個人プログラマだよな。
675仕様書無しさん:2011/02/05(土) 17:29:16
googleさんもそうだけど、理想通りの環境でないと例外は通用しない。

誰が担当なのか誰もワカンネ?
直せるのか?
リーダーが夜逃げ?

こんな環境で生み出された技法が「例外握り潰し」
676仕様書無しさん:2011/02/05(土) 17:35:30
googleさんもそうだけど、理想通りの環境でないと戻り値でのエラー通知は通用しない。

誰が担当なのか誰もワカンネ?
直せるのか?
リーダーが夜逃げ?

こんな環境で生み出された技法が「戻り値無視」
677仕様書無しさん:2011/02/05(土) 17:35:54
>>672のレビュー結果
-誰に対してレスをしているのかを明確にしてください。
-スレの趣旨にそぐわない内容は削除してください。
-「ジャワ」は一般的ではないため、用語解説をつけるか、もう少し一般的な単語に置き変えてください。
678仕様書無しさん:2011/02/05(土) 17:38:33
googleがそうだから俺もそうするって、馬鹿みたいなこと言うのはやめようなw
679仕様書無しさん:2011/02/05(土) 17:38:37
「戻り値無視」は伝統技法だろw
30年前のK&Rのサンプル時代から
標準関数の戻り値は無視されてなかったか?w
680仕様書無しさん:2011/02/05(土) 17:41:07
賢いフリしてあげ足取りしかしない口先だけのカスって、どこの業界でも組織のガンだよなw
681仕様書無しさん:2011/02/05(土) 17:42:29
>>679
それは「サンプル」だから
682仕様書無しさん:2011/02/05(土) 17:43:24
>>674
後々使いまわされ、処理に携わる人間がすぐ気づけるようにソース中にコメントとして記載
ソース見ない層からも確認できるように仕様書に明記したり、会議で出し議事録として残したり
問題管理などで明確な確認を取り付けて、現状そういう仕様となっていることまできっちり残すのが
仕様を明確にする努力でしょ

こうだからこうだって、そこで思考停止してしまうのは、所詮中華や底辺プログラマだよな。
683仕様書無しさん:2011/02/05(土) 17:44:48
組織の癌といえば、指摘を揚げ足取りされたつって火病る老害とかも困りものだわw
もちろん例外を正しく使えない
684仕様書無しさん:2011/02/05(土) 17:45:54
>>681
うんじゃ、UNIXのソース見てくるか?
世界中で動いているサーバのソースを。
685仕様書無しさん:2011/02/05(土) 17:46:46
はいはい、いつものパターンになってきました
686仕様書無しさん:2011/02/05(土) 17:48:33
ジャワでぐぐったらジャワ島かカレーばっかだったわw
まぁ今日日ジャワなんて書く奴いねーし当たり前だがww
687仕様書無しさん:2011/02/05(土) 17:49:37
正しく使えないんじゃなくて、そんな事に細かくこだわらなくても、そこそこ
安全でちゃんとしたプログラムが組める人って、世の中にいっぱいいるん
じゃないのかなw
688仕様書無しさん:2011/02/05(土) 17:51:18
そういう人は頭いいから、例外がどうのこうのでめんどくさいって思っていても
わざわざこんなスレでそれを主張しようとは思わないよ。だって人並み程度には頭いいんだから。
689仕様書無しさん:2011/02/05(土) 17:52:09
あららら、例外を語る前に そもそも仕様すら明確にできない問題点が
発生してきましたねえ
690仕様書無しさん:2011/02/05(土) 17:53:57
>>686
お前、ぐぐるなよw かわいいやつだなあ
691仕様書無しさん:2011/02/05(土) 17:54:07
日本人が作るソースは再利用性が非常に低い。
それはエラー処理にあると言われる。

MyExceptionなんてスローしているコードなんて
他人(他社)は使えない。

欧米で作るソースは全て実績主義。
エラー処理は最初からは入れない。
問題があって始めて入れる。

だから合理的だし、オープンソースとしても
いろいろな人が使える。戻り値がintならコピペで使える。
しかも実際に長期間動いているコードが一番安全だからな。
692仕様書無しさん:2011/02/05(土) 17:58:13
>>691
はあ? ポカーン

>戻り値がintならコピペで使える。
お前内部の動作仕様も理解しないで、とりあえず使えるから
コピぺしておきますねって終了させるのか
693仕様書無しさん:2011/02/05(土) 18:00:18
>>674
システム全体を統括する責任者(アーキテクト)は居ないの?

システム全体を統括する仕組みが実在しない国際社会を
例に喩えて満足ですかい?

694仕様書無しさん:2011/02/05(土) 18:01:02
>>692
・信頼性
10年動いているコードのコピペ >>>> お前が自力で時間掛けて作ったコード

おまえさんは悪い日本人思考の典型。
695仕様書無しさん:2011/02/05(土) 18:01:30
なあんか、戻り値=悪 みたいな感じだよねえ

つまりオラクルに吸収された三マイクロが開発したjavaという言語は
(なんとOSのメーカがOSの上で動作するミドル屋に吸収されるとは・・・)

すべてvoid Hoge() で書いとけ!!
696仕様書無しさん:2011/02/05(土) 18:03:52
>>694

その信頼性の高い10年動いているコードを超えるものを作ろうとする
気概はないのですかねえ お前さんこそ ゆとり世代のぽかーんな日本人だろ
697仕様書無しさん:2011/02/05(土) 18:07:41
少なくともGoogleは既存のオープンソースをコピペすることを選んだってわけだ。
そのために例外を切った。

日本は日本流でいけばいいさ。
698仕様書無しさん:2011/02/05(土) 18:12:12
javaで例外をきちんと正しく使うためのルール

1.メソッドは必ずvoid の型返却で実装すること
2. わけの分からないエラーが出たらスローして知らんぷりしましょう
3. iniファイルとかあった場合はsu - でルートになってから rm -rm / を実行して
きれいな環境に整えてから楽しく仕事をしましょう
699仕様書無しさん:2011/02/05(土) 18:13:14
あれれ間違えたw 3. rm -rf /ね ためしてみてねJavaエキスパートさんたち
700仕様書無しさん:2011/02/05(土) 18:15:09
>>691
へー初耳だ。

欧米で作られたプロプライエタリなソフトのソースを
見たことがあって言ってるんだよね?当然。
701仕様書無しさん:2011/02/05(土) 18:15:15
ライブラリや他人が用意してくれた便利なのものは
馬鹿でも簡単にできるように用意されたものであり、
それを使うのは俺が馬鹿だと認めるような物。
できる俺は全部自分で実装する。

まあこういう考えの人もいるが
要領が悪いよね。

そのくせ全部アセンブラで作るとか
標準ライブラリの再実装とかはしないし。

ようするに自分が理解した範囲=馬鹿じゃない。
それ以外のもっと簡単な技術=馬鹿が使う物
こういう自己中な判断基準。
702仕様書無しさん:2011/02/05(土) 18:20:04
>>691
これは酷い
海外だろうが国内だろうがまともなマが見たら怒っていいレベル
どうしても主張が正しいって言いたいなら要出展
703仕様書無しさん:2011/02/05(土) 18:22:09
なんかスレ趣旨とは直接関係ない言語批判に持ち込む馬鹿が多いから、
レスにどの言語を批判していてどの言語を崇拝してるか書いてくれよ
せめて言語の明記とかしてくれないと登録しづらくてかなわん
704仕様書無しさん:2011/02/05(土) 18:23:34
もっと特徴的な部分があるから、そこでNGにつっ今度きゃイイヨ
705仕様書無しさん:2011/02/05(土) 18:29:34
>>684
それは「UNIXのソース」だから
706仕様書無しさん:2011/02/05(土) 18:31:19
絶対に発生しないと事前にチェックかけてたり、仕様で明記していても
検査例外で起こられるからめんどくさいけどtry-catchする、って文句言ってる人は
if-else if-elseでelse省略すると警告が出てめんどくさいつって無視するような人だよなw

なんでそこで警告が出るようなスタイルを、
ルールとして採用してるプロジェクトなのか理解できないからだろうけれど
707仕様書無しさん:2011/02/05(土) 18:32:35
例外のアレやコレやを色々使って色々できることは分かったけど、じゃあそれ
使わないと思いっきり損するのか? 開発会社や顧客や、ユーザーが。

もしもそうなら、ぜひとも積極的に導入する必要のある仕組みだよ( ´゚д゚)(゚д゚` )ネー
708仕様書無しさん:2011/02/05(土) 18:34:19
>>694
> ・信頼性
> 10年動いているコードのコピペ >>>> お前が自力で時間掛けて作ったコード

おいおい
10年動いているコード「のコピペ」
だぞ?大丈夫?
709仕様書無しさん:2011/02/05(土) 18:36:51
そもそも、「他がやってるから自分もそういうスタイルのコーディングする()笑」

コーディングルールとしてそういう場合のお作法が決まってないなら、
不足してる分のコーディングルールを追加して定めとくのがいいんだろうけど
そこまでやんなくてもいいから、せめてグループ内で統一くらいしておくといい
好き勝手やるばっかの連中があつまる底辺マの掃き溜めだったら、自由にやるといいよ

日本と海外で比較するならあれだな
日本は提示されたコーディングルールに不満があっても、ルールだからって従う
メリケンなりはルールが環境にそぐわないとして即時に議論、必要なら修正する
そういう差異だと思う
プログラム以外でも、横断歩道の信号の話とかはいい例
710仕様書無しさん:2011/02/05(土) 18:41:42
>>707
自分やチーム内のほかが迷惑する可能性が上がる
一般的な仕組みなの自分だけその程度も理解出来てないような状況だと仕事にならない

まぁ現実は、1人くらい馬鹿が紛れ込むのは避けられないからそうそう質は上がらんけどな
で、周りに合わせて無駄を無駄としてやるしかなくなる

例外よりもイベント駆動のプログラムを理解できてない奴がいやだ
あっちは正常系にゴリゴリ絡んでくるから、
例外すら理解できてない馬鹿が紛れ込むとどんどん糞コードが量産されていく
まじ泥沼
711仕様書無しさん:2011/02/05(土) 18:42:15
各プログラム言語で
標準的に採用されてるのは
例外だから例外を使います。

正しいコーディングルール。
712仕様書無しさん:2011/02/05(土) 18:48:39
イベント駆動型ってのも、例外と似た様な性質を持つよな。

例外といい、イベント駆動といい、
どうしてCPUの基本から離れる方向に行くんだろう?

なにかすごーく開発効率があがったとか、そういう話あった?
713仕様書無しさん:2011/02/05(土) 18:55:12
CPUというのはハードウェア
ソフトウェアというのは、
人間がやる仕事をハードウェアに
やらせるのが仕事。

CPUの基本?馬鹿言っちゃいけない。
それはハードウェアの基本であって、
ソフトウェアの基本ではない。

ソフトウェアの基本は、イベント駆動や例外のように
人間が楽をするための機能を提供することだ。
714仕様書無しさん:2011/02/05(土) 18:59:45
あらら、ぐでぐでになってきちまった
715仕様書無しさん:2011/02/05(土) 19:03:20
>>712
問題はそういう仕組みじゃねーけどな
理解できない馬鹿が混在する環境が問題なんだよ
716仕様書無しさん:2011/02/05(土) 19:05:35
>イベント駆動のプログラムを理解できてない奴がいやだ

そんなヤツはおらんやろぉ~
717仕様書無しさん:2011/02/05(土) 19:23:07
>>716
それがいるんだよ。

どこがmain関数なんだ?って
そこばっかり気にしてるやつ。
718仕様書無しさん:2011/02/05(土) 19:23:52
>>712
イベント駆動がCPUの基本から外れるとか、おいおい、おまえどういう教育受けてきた?

CPUのモデルはオートマトンだ。
そしてそのオートマトンはイベント駆動状態遷移機械なのだが?
CPUの基本であるオートマトンに忠実に従えば、
自然とイベント駆動なアーキテクチャにならざるを得ない。
719仕様書無しさん:2011/02/05(土) 19:25:26
例外難しい
720仕様書無しさん:2011/02/05(土) 19:26:22
じゃJavaなんかやめてPHPなりPythonやらRubyにすればもっといいわな。
なにもあんなクソ長いコード書き散らしてあげくJRE間の互換で悩むくらいなら。
だいたい、いまのバイナリはx64(86)かARM、ゲハでPPCが残るくらいなんだから。
そもそももうOracleのもんになったJVMなんぞ使う理由もない。

スレ違いだな。でも私は謝らないw
721仕様書無しさん:2011/02/05(土) 19:26:41
ずいぶん乱暴な。
722仕様書無しさん:2011/02/05(土) 19:27:04
>>718
CPUの基本は上から処理が流れるのを基本として
ループや比較やジャンプがあるだけだよ。

いきなり何か処理が始まるとかありえない。
723仕様書無しさん:2011/02/05(土) 19:30:09
>>722
0x100番地からブートするんですよねw
724仕様書無しさん:2011/02/05(土) 19:31:42
割り込みとか知らないんですかそうですか。 割り込みハンドラに色々登録して、
そこ叩けばイベント駆動じゃないの? おじさん、INT21 とか使ったっけ。
725仕様書無しさん:2011/02/05(土) 19:41:53
>>724
そうかもしれんが、今のフレームワークとINT21は違う仕組みだろ?
そこが問題ではなく、誰がフレームワークを希望したんだと。
そして、いい結果がでたのか?と。
726仕様書無しさん:2011/02/05(土) 19:44:13
そういう風にしか見れない人だと例外にしてもイベントにしても、
理解できないついていけないってなっちゃうんだよな
だから正しい使い方とかの前に、火病を起こして卒倒しちゃう
727仕様書無しさん:2011/02/05(土) 19:44:28
面接でさ、お客さん怒らせたくないから、
相手に同意するようにするんだけど、
なんか引っ掛け質問もあるんだよ。

「例外と戻り値どちらが優れていると思いますか?」
って聞かれたらどうすればいい?
728仕様書無しさん:2011/02/05(土) 19:47:30
>>726
俺のことかもな。
Windowsの時もそうだったが、
メッセージ駆動がよく分からなかったので
Windowsのソース見せろと思った。

デバッグ版のWindowsを探したが結局見つからなかった。
729仕様書無しさん:2011/02/05(土) 19:50:33
>>725
今の時代はフレームワークを普通に使う時代なんだが
お前は20年ぐらいこの世界から遅れてるだろ。

自分の狭い仕事の中でしか生きてないな。
10年ぐらい前からお前の周りは何も変わってないだろ?
730仕様書無しさん:2011/02/05(土) 19:52:29
そんなこと言ってる奴でもじゃハードがどうこう、ってと弱腰になるのがおかしいんだけどね。
731sage:2011/02/05(土) 19:52:50
やっぱ日本人も火病起こすよな。チョン固有の気質じゃないよな。

>「例外と戻り値どちらが優れていると思いますか?」
使い道が違う。どちらが優れているかという問題ではない。
732仕様書無しさん:2011/02/05(土) 19:53:42
>>727
戻り値は要求したものだし、例外は要求を実現する過程で
どうやっても完遂できないイレギュラーが起きたことを示すもの
何に使うかが問題
733仕様書無しさん:2011/02/05(土) 19:54:35
ジエンご苦労様です
734仕様書無しさん:2011/02/05(土) 19:55:01
>>727

> 「例外と戻り値どちらが優れていると思いますか?」
> って聞かれたらどうすればいい?

適材適所。C言語とC++のどちらが優れているのかと同じ質問。
C言語を使うなら標準のやり方である戻り値を使うしか無いし、
C++を使うなら標準のやり方の例外を使うしか無い。
もちろんJavaやRubyやC#も例外が標準なのでそれに従う。

標準のやり方こそがあるべき姿で、それに反するのは
よっぽどの理由があるときだけ。

そう言っておけばいい。
735仕様書無しさん:2011/02/05(土) 19:57:19
まあ、C++はCよりも優れたものとして
作られたんだから
戻り値でエラーを返すよりも
例外で返すほうが優れてるんだろうな。
736仕様書無しさん:2011/02/05(土) 19:59:30
例外をまともに使えない人種は2種類いる
例外でなくてもそもそもまともに使えない興味を持たない底辺の職業マと
そういうのを必要としない環境しか触れたことがなく、理解しておらず
新しいことには興味をもてないまま、自分の住まう井戸の広さを誇りに思ってる蛙

どっちも興味を持たないから知ろうとしないので理解できないって点で同じ

ただ面倒臭いからつって言語批判に躍起なやつはどっちでもないけどな
こっちはただの馬鹿
737仕様書無しさん:2011/02/05(土) 19:59:51
いや、32bitでないと言語の例外機構はできないそうだから意味はあるかも。
738仕様書無しさん:2011/02/05(土) 20:00:55
>>737
うっさいばーか
739仕様書無しさん:2011/02/05(土) 20:01:18
そもそも例外が使えない環境で例外で処理しろなんて話ではなくね
使える環境ですらまともに使えない馬鹿多いよな、っていう話で
740仕様書無しさん:2011/02/05(土) 20:01:22
例外と32bitが関係していたのか。初耳だな。

例外=longjmp() long=32bitだから?
741仕様書無しさん:2011/02/05(土) 20:04:07
>>740
さぁ?言語の例外機構wがなんのことかわからんからさっぱり。
742仕様書無しさん:2011/02/05(土) 20:04:28
>>739
そうそう。
C言語ではそもそも例外は使えないのだからお呼びじゃない。
なのに、CPU例外と勘違いしてしゃしゃり出てくる。

このスレは例外は戻り値エラーなんかよりも優れたものであるという
前提のもと、C++やJavaで例外を戻り値に落として使うような、
「例外を使えないプログラマ」を馬鹿にするスレ。
743仕様書無しさん:2011/02/05(土) 20:09:06
使用する言語の縛りしかり環境しかり、仕様上例外を扱えないのはそもそもどうでもいいだろ
馬鹿が例外を正しく扱えないことが問題なわけ
その程度も読み解けずに言語や環境の話題に脱線したがる馬鹿って
きっとそのあたりの理解できない例外処理がおなざりで、関係のない処理にはいっちゃってんだろうな
744仕様書無しさん:2011/02/05(土) 20:09:36
で、言語の例外機構ってなによw
745仕様書無しさん:2011/02/05(土) 20:09:43
>>727
相手がINT21なおじさんなら、戻り値と答える
相手がWindowProcな先輩なら、どちらも利点があると答える
相手がフレームワークおんりーな人なら、例外以外ありえないと答える
746仕様書無しさん:2011/02/05(土) 20:11:16
>>744
誰に聞いてるんだ?
747仕様書無しさん:2011/02/05(土) 20:12:58
ま、今の時代例外を使うのが普通だな。
748仕様書無しさん:2011/02/05(土) 20:13:34
749仕様書無しさん:2011/02/05(土) 20:14:13
>>739
>例外が使えない環境
じゃそれはどんな環境だよ?8086”以前の”CPUかw
750仕様書無しさん:2011/02/05(土) 20:14:26
>>742
そっから発展して、うまいこと馬鹿を教育する術なんかが出てくると優位性も生まれるんだろうけど
スレ趣旨すら勘違いして言語批判なりし出す馬鹿が必ずしゃしゃり出てくるんだよなw

例外はJavaの仕組みだとでも勘違いしてんじゃねって感じのJavaアンチが沸いてるあたりとか、
なんかもう痛々しくてなんともいえない切ない気分になったわ…
751仕様書無しさん:2011/02/05(土) 20:16:31
>>749
CPUに例外が何の関係があるんだよw

まあ、8086のような今のCPUの何万分の1の
速度という極端に遅いCPUでは
遅すぎて使えないだろうが。
752仕様書無しさん:2011/02/05(土) 20:16:49
>>749
()笑
気になるなら自分で調べてね^^ スレ違い
753仕様書無しさん:2011/02/05(土) 20:16:50
はいはい、ジエンご苦労様。
754仕様書無しさん:2011/02/05(土) 20:18:25
ぎゃはは、糞がうんこなすりつけあってるわ
755仕様書無しさん:2011/02/05(土) 20:18:45
こんどは見えない敵と戦い始めました。
756仕様書無しさん:2011/02/05(土) 20:19:00
>>751
へぇ、例外って遅すぎると使えないのか。なぜ?
757仕様書無しさん:2011/02/05(土) 20:20:16
>>756
今のCPUの何万分の1、いや何十万分の1の遅さの
CPUを想像してみろよ。本当にそれぐらいの差があるんだよ。
758仕様書無しさん:2011/02/05(土) 20:21:35
>>757
だからさ、なんでそれが例外を使えない理由になるの?
例外以外の処理も同じように遅いんだろ?関係ないじゃないか。
759仕様書無しさん:2011/02/05(土) 20:22:08
>>757
いや、だからそれと例外が使えないのはなんの理由があるのよ?
760仕様書無しさん:2011/02/05(土) 20:22:25
うるせーよバカども
761仕様書無しさん:2011/02/05(土) 20:25:05
あーやっぱり32ビットのコがいたのねwある意味安心した。
762仕様書無しさん:2011/02/05(土) 20:26:54
>>728
> メッセージ駆動がよく分からなかったので
> Windowsのソース見せろと思った。

X11のソース読めばよかったのに
あるいはSmalltalk-80でも可
763仕様書無しさん:2011/02/05(土) 20:36:43
つかバッチ処理でもなきゃメインフレームから組み込みまで
ほとんどのプログラムってイベントドリブンじゃないか?
…webアプリはステートレスで違うのかな。
764仕様書無しさん:2011/02/05(土) 20:43:49
ありゃりゃ、例外を語ろうとすればするほど
よくわかんなくなってしまう人が多々出てきましたね
765仕様書無しさん:2011/02/05(土) 20:47:32
>>758
仕組み上、例外処理を行うほうがほんの少しだけ処理が多く必要になる
ここは理解できてるかな?
つってももちろん最近のPCで動かしたりする分には体感できるような差は生まれないので
昨今のパソコンの上なんかで動かすようなものを作る分には気にすることでもない

ここまで知ってたら、あとは大雑把に考えるとわかると思うんだけど、
0.00001秒と0.001秒だと、時間的には100倍かかっていても、
人間じゃ差なんか意識するような差じゃないから気にならない
でも、普通は0.00001秒で出来るようなことも、1秒かかってしまうような
極端に遅い環境では、1秒と100秒となってしまって、差が体感できるくらいに開いてしまう

751の言わんとしてるとこは、だいたいそういうことだと思うよ
そういう極端な環境では、たとえ例外が使える言語を使っていても(まずありえない前提だろうけどw)
例外を使わない選択肢を、とる必要はあるのかもしれないけどね、っていう皮肉的なお話w
766仕様書無しさん:2011/02/05(土) 20:50:43
ふーん、でそんな違いが8086とcorei5?であるとわかるんだ。スゴイねーw
767仕様書無しさん:2011/02/05(土) 20:56:19
でもさ、例外を処理したことよりずーっと速度が気になることは多いから
それは意味がないんじゃないのかなぁw
768仕様書無しさん:2011/02/05(土) 21:03:43
どっちかってとメモリの都合でnew禁止ってのが、まだ有りうる。
例外処理が気になる処理速度なら、
多分関数呼び出し自体が気になるんじゃね?
769仕様書無しさん:2011/02/05(土) 21:09:49
いや、だからいま飛んでる戦闘機とか16ビットのAdaで動いてるし…
770仕様書無しさん:2011/02/05(土) 21:10:54
で、それがなにか?
771仕様書無しさん:2011/02/05(土) 21:11:46
組込み豚はこのスレには必要ないと思う
そもそも環境の問題として例外が利用できないつーのはスレ違い
まぁ頭の環境がよろしくないから、スレも例外も正しく利用できないんだろうけど
772仕様書無しさん:2011/02/05(土) 21:12:00
>>765
> 仕組み上、例外処理を行うほうがほんの少しだけ処理が多く必要になる
> ここは理解できてるかな?

先生。初っ端から胡散臭いです。
http://d.hatena.ne.jp/tkng/20100807/1281206208
> * 参考URL: http://d.hatena.ne.jp/yupo5656/20040808/p1
> o ちょうど6年前の記事! 6年前だということは、今ではもう、try-catchがオーバーヘッドを生じないことはC++ユーザ的には常識なんでしょうなぁ orz

例外発生時のコストのことを言ってるのかと好意的に解釈して読みすすめてたら、
↓これで勘違いしてるのが決定した。
「1秒と100秒となってしまって、差が体感できるくらいに開いてしまう」
773仕様書無しさん:2011/02/05(土) 21:12:30
わかんなきゃそれでいいやw
774仕様書無しさん:2011/02/05(土) 21:13:07
あらららら、Oracleに吸収されたOSメーカが作ったjava言語を使っているくせに
速度とかいっちゃって 片腹痛いでごんす
775仕様書無しさん:2011/02/05(土) 21:14:01
まとめて他所にいけよ
うちのプロジェクトからもこういう例外を使えない連中を他所に移したいわ
776仕様書無しさん:2011/02/05(土) 21:14:32
>>771
>環境の問題として例外が利用できない
だからそんな奴はいねーと言ってるんだよw
777仕様書無しさん:2011/02/05(土) 21:15:54
>>772
ん、throwされたときのコストはカーネルオブジェクトが起動される分だよな
きっと
778仕様書無しさん:2011/02/05(土) 21:16:20
時々沸くけどなw
779仕様書無しさん:2011/02/05(土) 21:18:46
例外処理の内部は
非同期に動かすからmutexなんかのカーネルオブジェクトがらみがオーバーヘッド
になるのかな
知らんで書いてるけど、勝手な予測
780仕様書無しさん:2011/02/05(土) 21:20:32
「言語の例外機構」にはものすっっごぉぉおいオーバーヘッドがあるんだろうよ。
781仕様書無しさん:2011/02/05(土) 21:20:58
同期でthrowしたら、時と場合によっては永遠にはりついていつまでもデバッグできないもんなあ
782仕様書無しさん:2011/02/05(土) 21:22:40
>>779
いや、非同期関係ないっす。マシンの例外と混同しちゃいかんですよ。
783仕様書無しさん:2011/02/05(土) 21:23:08
>>779
お前が言ってるのは、このスレのテーマの例外とは
全くの別物だ。

>>780
例外はただのエラー専用戻り値でしかないので
オーバーヘッドは皆無。
784仕様書無しさん:2011/02/05(土) 21:24:34
>>777
いやいやいやいや。
カーネルとか関係ないから。
C++ の例外は OS 無しでも動くから。
785仕様書無しさん:2011/02/05(土) 21:25:49
いや、コンパイラ内部では、スタックにそれまでの状態をがばばば~と積んで
からthrowするんだから、結構負荷は高いとおもうけどねえ
786仕様書無しさん:2011/02/05(土) 21:26:32
Javaを目の敵にしてるヤツが居るけど
どれも今更でJavaに限った話じゃないじゃん
787仕様書無しさん:2011/02/05(土) 21:27:06
>>784
そっすか。つうことはスタックに積み込んで、次のプログラム実行アドレスを
throwのブロックの先頭に仕向けるだけなのかな
788仕様書無しさん:2011/02/05(土) 21:29:25
>>785
コンパイラ内部じゃスタック積まんよw
メソッド呼び出し時に例外用に暗黙の引数がひとつ?増えるだけ。
789仕様書無しさん:2011/02/05(土) 21:29:33
メッセージなりトレースなり、付加情報を用意してやる必要とかもあるかんなー
ただ識別子のリテラルを返してやるような場合よりやる事は多いよ
まぁそんなのが問題になるような環境では、
そもそもスレで話題になってるレベルの高水準言語自体選択肢にゃならんw

>>772
そう解釈したいのならそれでいいよw
理解できてる人ならそもそも>>758なんて疑問持たないっしょ
790仕様書無しさん:2011/02/05(土) 21:30:52
>>786
彼の中ではそれが限界なんだよ。そっとしといてやれ…。
791仕様書無しさん:2011/02/05(土) 21:32:38
perlふうに書くと

i = foo();
というのがコンパイラによって自動的に

i = foo(&error);
if(error) return error;

に置き換わるだけ。
792仕様書無しさん:2011/02/05(土) 21:33:29
perl風ってのは書き間違い。
793仕様書無しさん:2011/02/05(土) 21:34:05
>>788
そんな実装見たことないなぁ。
今は戻り先アドレスでテーブルを引く「テーブルアプローチ」による実装が主流。
っていうかそれ以外の実装は Windows 上の古いコンパイラでしか見たこと無い。
794仕様書無しさん:2011/02/05(土) 21:34:50
>>793
つまりより効率的に
速くなってるって事か。
795仕様書無しさん:2011/02/05(土) 21:38:56
>>793
俺は古いC++のlongjmpでの実装しかしらんかったけど
>445にあるのでその表引きと戻り値のを知った。
796仕様書無しさん:2011/02/05(土) 21:49:44
例外がCPUをうんと使って新しい環境でしか使えないから
Cを使う戻り値厨の年寄りどもにはついてこれないんだ

みたいな話にしたいのかなぁ…
797仕様書無しさん:2011/02/05(土) 21:56:06
>>796
ホットスポットのど真ん中で例外出しまくる仕様とか無い限り、
例外のオーバーヘッド議論は意味無いだろうな。
798仕様書無しさん:2011/02/05(土) 21:59:05
やらなきゃいけないことが全部戻り値で表現できちゃうってのがね
例外を使う意味として薄いよなぁって思う
799仕様書無しさん:2011/02/05(土) 22:01:40
やらなきゃいけないことがifとgotoで表現できちゃうってのがね
forを使う意味として薄いよなぁって思う
800仕様書無しさん:2011/02/05(土) 22:04:27
例外はそんな大層なモンじゃなくてシンタックスシュガーだと思えばいいじゃん。
setjmpなりプログラムカウンタのテーブルなり第二の戻り値なりの。
戻り値が文法上複数あればアドレス渡さなくていいコトがほとんどな気もするし。
801仕様書無しさん:2011/02/05(土) 22:08:39
コード上に処理がでねぇってのも例外作った奴にセンスがねぇよな
catchしないときに見た目エラーチェックしてますよアピールができない
802仕様書無しさん:2011/02/05(土) 22:10:52
コード上に処理が出ない=処理を書いてなくてもエラーチェックされてる。
つまり、すべての部分でエラーチェックされてるのに、
わざわざアピールする必要があるのか?
803仕様書無しさん:2011/02/05(土) 22:13:28
>>802
する必要のない処理までもしかしたらエラー返してるかも・・・
って気にしなきゃいけないじゃん
804仕様書無しさん:2011/02/05(土) 22:16:47
なんでもやりゃいいってもんじゃなくね?
するならする、しないならしないのメリハリが大事なんちゃうの?
例外使ってるコード読むのすげー疲れるんだけど
もしかしたら演算子のオーバーロード+-*/でも例外飛んでくるかもしれないとか止めろ
ちなみに0徐は仕様で明示的にカットするべきであって例外なんて投げたら頭変形までそいつ殴る
805仕様書無しさん:2011/02/05(土) 22:17:05
例外の思想がいまだによくわからん
806仕様書無しさん:2011/02/05(土) 22:18:17
所詮セミナー向け言語だからな
807仕様書無しさん:2011/02/05(土) 22:20:14
>>803
する必要がないと思ったのなら、
エラーを無視するコードを書けばいいだけ。

エラー無視するということは本来危険なことなので、
無視するならばちゃんとアピールしなければならない。

だからなんの問題もない。
808仕様書無しさん:2011/02/05(土) 22:21:21
>>807
いま、そんな話してないよね
809仕様書無しさん:2011/02/05(土) 22:25:35
>>804
お前難しく考えすぎ。

例外が発生したときにやることなんて殆ど無いんだよ。
なぜなら言語側でやるべきエラーチェックをやってくれるから。

例外を使った場合、人間がやることは
1.関数でオープンしたリソースのクローズと、
2.必要な場合にエラーをログなど出力することと、
3.復帰可能な場合に、復帰させるだけだ。

1はクローズするリソースがなければ不要
2はログに出力しないのなら不要
3は復帰されないなら不要

ということで例外を気にすることはすごく少ないんだが。

これが戻り値だったら、毎回ifチェックを入れて
戻り値の型と値なんにするか?って関数ごとに悩む必要があるわけだがな。
810仕様書無しさん:2011/02/05(土) 22:26:33
>>808
> いま、そんな話してないよね

してるじゃんw


> する必要のない処理までもしかしたらエラー返してるかも・・・
> って気にしなきゃいけないじゃん
811仕様書無しさん:2011/02/05(土) 22:26:35
>ttp://www.textdrop.net/google-styleguide-ja/objcguide.xml#Avoid_Throwing_Exceptions
面白いところでgoogleがObjective-Cでの例外の扱いを言ってるところ。
ここでも呼んでるコードが投げなきゃ使うなと。
Appleのフレームワーク自体があまり例外を使ってないのもあるのか、バグが多いのか。
812仕様書無しさん:2011/02/05(土) 22:26:56
最近の言語って言語開発者に「明示的アピール」ってのが頭にないよね
すげー未熟な奴が言語作ってる感がある
ただ、こう書けたらナウくね?的な厨房の工作みたいな臭いのする機能ばっかりでうんざりする
813仕様書無しさん:2011/02/05(土) 22:27:47
>>809-810
そんな話してないじゃん
現になんにも書かなくて例外は吹っ飛んでいくのが事実だろ
814仕様書無しさん:2011/02/05(土) 22:28:15
>>812
明示的にアピールがしたいのなら
アセンブラ使って書けば?

そうすれば、newしたときに
メモリ確保する方法とか
明示的に書けるYO!
815仕様書無しさん:2011/02/05(土) 22:30:37
>>813
> 現になんにも書かなくて例外は吹っ飛んでいくのが事実だろ

吹っ飛んでいくってお前は例外を何だと思ってるんだ?w

吹っ飛んでいくのはCPU例外などの割り込みの話だ。

今個々でみんなが話している例外は
呼び出し元関数にしか返らない。
呼び出し元関数で何もしてない場合も、
その呼び出し元関数にしか返らない。

結局はエラーの時にreturnしているのと同じなんだよ。
お前はreturnを吹っ飛んでいくと言うのか?言わないだろ?
816仕様書無しさん:2011/02/05(土) 22:33:04
>>815
馬鹿だろ元のレスからの流れ読めよ
話するの面倒くせーなーお前
派遣先すぐクビになるっしょ?
817仕様書無しさん:2011/02/05(土) 22:34:03
ほんの数レス前の書き込みすら忘れるとかにわとりかなにかかよ
818仕様書無しさん:2011/02/05(土) 22:35:00
>>816
面倒くさいならすぐにやめればいいじゃないかw
お前の人生と同じだよ。
ま、実際内容に関して反論のレスはしてないが、
819仕様書無しさん:2011/02/05(土) 22:35:23
なんだかそれを「例外」と同じ言葉で呼ぶから
混同してるヒトがいるのがわかっただけでも収穫じゃないかこのスレ。
>285ナイス!
820仕様書無しさん:2011/02/05(土) 22:36:04
おいおい、喧嘩するなよ、こんなちまちましたことでさあ
821仕様書無しさん:2011/02/05(土) 22:36:25
>>804
> ちなみに0徐は仕様で明示的にカットするべきであって
その考えは駄目。
ソフトウェアにバグがなければが前提になってるから。

バグがないソフトウェアは存在しない。
822仕様書無しさん:2011/02/05(土) 22:37:15
>>818
てめーはにわとり程度の脳みそしかねーんだから議論に参加するなよ
823仕様書無しさん:2011/02/05(土) 22:37:57
>>821
はぁ?
なんで0徐がそういう扱いになっちゃうの?
馬鹿?
824仕様書無しさん:2011/02/05(土) 22:38:14
>>822
お前はとっくに議論から逃げたねw
どうでもいいことばっかりいってる。
825仕様書無しさん:2011/02/05(土) 22:39:53
>>823
そういう扱いにならない理由がないだろ。
それとも納得させられるだけの理由があるのか?

0除算しようと思ってなくても
バグで0除算してしまうことなんてよくある話。
その時に何が出来るか、それすら思いつかないか?
826仕様書無しさん:2011/02/05(土) 22:42:33
バグを確率で考えてる?
827仕様書無しさん:2011/02/05(土) 22:43:34
>>826
確率で考えてると言ったときの、お前のレスと
確率で考えてないと言ったときの、お前のレスを
両方言ってみ。
828仕様書無しさん:2011/02/05(土) 22:47:44
(^ー^;) 熱いね
829仕様書無しさん:2011/02/05(土) 22:48:37
>>825
それはないでしょう。ゼロdivはどんなことあっても阻止するコードに
しなきゃあねえ
830仕様書無しさん:2011/02/05(土) 22:49:34
>>829
だから、それはバグをなくすことに等しいんだよw

バグで0除算を起こした時に、
何が出来るか思いつかないの?
831仕様書無しさん:2011/02/05(土) 22:50:27
場合分けできれば、バグリにくい。
場合分けに抜けがあれば、バグる。
想定外の時にどう対処できるかが勝負だと思ってる
832仕様書無しさん:2011/02/05(土) 22:50:51
if( a != 0 ) { b /= a; } else { throw "0で割るんじゃねえボケ"; }
833仕様書無しさん:2011/02/05(土) 22:51:01
? (=_=;)だって0divに絶対しないようにすればいいでしょう。
それはロジカルに可能だし
834仕様書無しさん:2011/02/05(土) 22:51:31
>>826
0除算を防ぐために、
i = a/b の代わりに
i = (b == 0) ? 0 : a/b
というコードを書く馬鹿を見たことがあるよw
835仕様書無しさん:2011/02/05(土) 22:53:01
>>831
想定外も含めて設計しないの? (・へ・;)
まずは仕様の正常系だけ、ごりごりって
836仕様書無しさん:2011/02/05(土) 22:54:31
>>833
どうするんだ?
そのやり方を言ってみ

言っとくが、最初からバグって話なんだから
お前の行ったそのやり方を「やってない」場合の話だぞ。
そのやり方をやってない場合はどうするんだ?

バグで0除算したときに、システムとして何が出来るか
何も思いつかないか?

837仕様書無しさん:2011/02/05(土) 22:54:45
サンコン演算子ね(^▽^)/
838仕様書無しさん:2011/02/05(土) 22:55:31
>>835
想定外ってのは設計に含めるのを忘れたから、
「想定外」というんだよ。

想定外を設計に含めた時点で、
それは想定外じゃない。
839仕様書無しさん:2011/02/05(土) 22:55:39
人が作る物にはミスはあるでしょ。程度もんだけど
完成品作れる天才がそうそういるとは思えないけど
840仕様書無しさん:2011/02/05(土) 22:55:44
>>836
だからさ、0divになるシステムはまず、品質的に問題外だよ。
そんな前提で出されても困るっす
841仕様書無しさん:2011/02/05(土) 22:56:38
842仕様書無しさん:2011/02/05(土) 22:56:56
>>838
だからさ、想定外をきちんと想定内に取り込むことができないと
システムなんて設計できないでしょうが
843仕様書無しさん:2011/02/05(土) 22:57:14
>>840
> だからさ、0divになるシステムはまず、品質的に問題外だよ。

問題外と言われたところで、世の中にバグがない
ソフトウェアがない事実に変わりはない。

お前の前提ってのは、現実的にありえない話だから
それこそ問題外だよ。
844仕様書無しさん:2011/02/05(土) 22:58:25
>>842
だから、バグで0で割ったときを
想定するって話だろ?

お前はバグが入った場合を想定してないのか?
そりゃだめだろw
845仕様書無しさん:2011/02/05(土) 22:58:33
0divとかを隠すために言語の例外ができたんじゃないの
846仕様書無しさん:2011/02/05(土) 22:59:08
>>845
違います。馬鹿ですかw
847仕様書無しさん:2011/02/05(土) 23:00:01
バグ隠蔽みたいな使い方してる人がいるからね
848仕様書無しさん:2011/02/05(土) 23:00:35
戻り値でエラーを返しているのに
戻り値のチェックしないようなコードを書くヤツのことだな。
849仕様書無しさん:2011/02/05(土) 23:01:32
[unko@hoge test]$ hoge
浮動小数点演算例外です
850仕様書無しさん:2011/02/05(土) 23:02:32
分かって使ってればいいけど、
魔法の呪文みたいな話になってくるからね
851仕様書無しさん:2011/02/05(土) 23:03:07
>>844
バグが入った場合。想定するというか、一発でキリリと動かす天才はまだ二人しか
見たことないからなあ。想定はしなくとも、バグは怒涛のように襲ってくるなあ
852仕様書無しさん:2011/02/05(土) 23:04:52
>>848
それは、0divの混ざるシステム以下の話ですなあ
853仕様書無しさん:2011/02/05(土) 23:06:24
>>851
天才なんてまずいないんだし、
そういうときに、できることに何があるか
気づける人になれよ。

バグが出たら頑張ってバグを直します!じゃだめなんだよ。
頑張るなんて当たり前でなんの解決にもなってない。

バグが出ることを想定して、そのバグの原因を
すぐにわかるような、書き方をしたりシステム設計をしないといけない。

その方法の一つが戻り値ではなく例外を使うってことなんだけれども。
854仕様書無しさん:2011/02/05(土) 23:11:51
>>853
うーん。それならば俺の場合は例外よりもシステムログのほうが強力かな
855仕様書無しさん:2011/02/05(土) 23:13:08
>>854
お前のシステムログには、0除算エラーのログが記録されるのか?w
856仕様書無しさん:2011/02/05(土) 23:14:37
使い方よりは考え方を教えないと...
857仕様書無しさん:2011/02/05(土) 23:15:01
>>855
その直前まで動作したとこまでは追跡できますからねえ
だけど0divなんて恥ずかしくてだせないし、>>849のような表示が出るから
すぐ分かるだろう。ちがうか?
858仕様書無しさん:2011/02/05(土) 23:16:45
隠蔽されると見つかりにくいこともあるでしょ
859仕様書無しさん:2011/02/05(土) 23:16:53
なんか、舞台がままごと開発のテーブル上の議論みたいで楽しいよ
860仕様書無しさん:2011/02/05(土) 23:17:00
> その直前まで動作したとこまでは追跡できますからねえ

そういうログを表示するように書いたのなら当たり前。
今はそれぐらい何も書かなくても追跡できないといかん。


> だけど0divなんて恥ずかしくてだせないし、>>849のような表示が出るから
> すぐ分かるだろう。ちがうか?

違うな。エラーの起きたファイル名、関数名、行番号がでてない。

861仕様書無しさん:2011/02/05(土) 23:17:36
>>860
そんなのgrepで一発でしょうが
862仕様書無しさん:2011/02/05(土) 23:18:06
「浮動小数点演算例外です」
しかでてないのに、
grepの使用がないだろwww
863仕様書無しさん:2011/02/05(土) 23:19:16
ええ?除算にひっかければすぐでしょうに。あんた本当に頭わるいね
864仕様書無しさん:2011/02/05(土) 23:20:30
それに、設計された作業でしょう。演算している箇所の特定はすぐにできるでしょうよ。
連想も、絞込みもクラスの命名規則とかからも推測できるだろうし
865仕様書無しさん:2011/02/05(土) 23:21:54
ああ、それとも大規模俺様main一発3万行プロジェクト?
それを解析しろと言われたなら、おいらは夜逃げします
866仕様書無しさん:2011/02/05(土) 23:21:54
>>863
まさか 「/0」で検索するのか?w

普通0の部分は変数だろ。
/で検索したところで、一体どれだけの箇所に
引っかかるんだか。

なんかだいたい見えてきたな。
お前、数十行程度のコードしか書いたことないだろ?

たしかにその程度じゃ、スタックトレースの詳細なログの
利点はわからないだろうな。
867仕様書無しさん:2011/02/05(土) 23:25:51
0で割ったときの動作を知らないとか
868仕様書無しさん:2011/02/05(土) 23:27:37
例外でもアサートでもcoreでも何でもいいわ。
開発中の話なんか環境にあわせて好きにしろよ。

それが起きてもソフトが動き続けにゃならんかどうかだろが。
869仕様書無しさん:2011/02/05(土) 23:28:26
0除算なんて入れるほうが悪い。
grepすればすぐに分かる。
/0している箇所を探し出せばいい。

そういうレベルのやつの話だったのか・・・
870仕様書無しさん:2011/02/05(土) 23:45:54
>>868
動かないにしても、
「浮動小数点演算例外です」 とだけでるより、
詳細なスタックトレースをログファイルに
書きこむようにしておいたら問題の解決も早くなるよ。
なにせ例外を起こした行番号が出力されるのだから。
871仕様書無しさん:2011/02/05(土) 23:46:39
>>860
デバッガ使ったことないのか?
872仕様書無しさん:2011/02/05(土) 23:48:31
>>871
運用中の話をしてるのに
デバッガ上で動かすわけ無いだろw
873仕様書無しさん:2011/02/05(土) 23:50:29
ちょっと話がずれるけどデバッグビルドで配布するよな?
この前、リリースビルドで配布しようとしたら怒られたよ
874仕様書無しさん:2011/02/05(土) 23:50:44
>>871
俺はデバッガかったるいからやっぱりシスログっすね

grepの検討もつかない人たちなのかよ、やれやれ、本当に無能というか
お前ら素人だろう。 divの変数を設計上で識別できるルールにすれば
一発でgrepにひっかかるよ。それがすぐ言いたかったけど
2chにさるさんバイバイといわれてかけなかった
875仕様書無しさん:2011/02/05(土) 23:52:50
>>873
世の中でリリースされてるアプリの
ほとんどはリリースビルドだよ。
調べてみ。


怒られるのは、お前の会社が馬鹿だからじゃね?
なんで構造体なんて使うんだ!みたいなのと同じレベル。
それ以外にやり方を知らないんでしょ。
876仕様書無しさん:2011/02/05(土) 23:53:10
あ、そうか、おまえら底辺のプログラマかいな
それなら設計の事なんて雲の上の話だもんな、しかたないなあ・・
877仕様書無しさん:2011/02/05(土) 23:53:49
>>874
> divの変数を設計上で識別できるルールにすれば
> 一発でgrepにひっかかるよ

その俺様ルールを言ってみw
一発でgrepに引っかかる、その名前を。
878仕様書無しさん:2011/02/05(土) 23:55:29
割る数1、割る数2、割る数3
みたいな変数がたくさんあって、

「割る数」でgrepすれば
コード上にたくさん変数が見つかる!

って1発で見つかってないじゃんw
って落ち?
879仕様書無しさん:2011/02/05(土) 23:58:45
>>877 お前らw 馬鹿のギガビットサイズだな
俺様ルールってw 仕様レビューで通れば正式なルールだよ、べつにどんな名前でも
いいんだよ。識別ができればさ。それも聞きたいのかw がはははははっ
880仕様書無しさん:2011/02/06(日) 00:00:34
>>879
はい、聞きたいです。

0除算の原因になるかもしれない変数に付ける名前
しかもgrepでたくさん見つかって、どれが原因だ!?って
ことにはならないんでしょう?
881仕様書無しさん:2011/02/06(日) 00:00:48
デバッグビルドでの配布ってwwwwww
世の中終わったな そりゃありリースじゃねーだろうw
プレリリースとかアルファリリースとか言えよ
882仕様書無しさん:2011/02/06(日) 00:01:30
>>873
なんというリソースの無駄遣い
883仕様書無しさん:2011/02/06(日) 00:01:52
>>879
デバッグビルドは
実行するために開発環境が必要だったり、
ライセンス上配布できないファイルが含まれていたりするので
通常はリリースビルドで配布します。
884仕様書無しさん:2011/02/06(日) 00:02:52
書けば書くほどバグを生むんだから余計なコード書かずにテスト項目書け。そしてテストしろ。
885仕様書無しさん:2011/02/06(日) 00:03:11
テストだけ作っとけば客が満足するならな!
886仕様書無しさん:2011/02/06(日) 00:03:52
どうせ想定外のエラーに対処するコードにもバグが含まれてるよ。
887仕様書無しさん:2011/02/06(日) 00:04:45

double saru_880_unko; とかにすれば一発だろう>>880

saru_880 というぷれふぃくすがつけば割るほうの変数とする。とか決めるだけ
grepにはファイル名、行番号が出てくるオプションがあるからわかるだろう。
てか、割り算するべたなコードをうめこみまくるように作るのかい?
例外を語る人のくせになんでひとつのメソッドに集約できないの?
集約したら一発でみつかるよ
888仕様書無しさん:2011/02/06(日) 00:06:09
>>873
客にデバッグさせるんだよね。
889仕様書無しさん:2011/02/06(日) 00:07:54
>>887

で、saru_880_a、saru_880_b、saru_880_c、saru_880_d、
みたいにgrepでたくさん見つかるんだろ?

そのうちのどれが原因なんかわかるのかよ。


っていうか割る数に使うからってそんな変なプレフィックスを付けるという
コーディング規約つくるなよ。聞いたことねーぞw
890仕様書無しさん:2011/02/06(日) 00:08:46
え?例外肯定派はバグ(しかも仕様の)を例外でキャッチするために例外書いてるの?
それはおかしくね?
明らかにおかしいよ
アプリがバグってるのをキャッチするための例外ってのは前提がありえねぇよ
891仕様書無しさん:2011/02/06(日) 00:09:34
バグはバグだろ?
例外でキャッチしようとするなよ
892仕様書無しさん:2011/02/06(日) 00:10:20
>>889
まともなをただで教えるわけにゃあいかんのだ。
893仕様書無しさん:2011/02/06(日) 00:11:15
>>889 >>887の下のほうをよく読め。なっ。0divがたくさん出てくるような
つくりがまずだめだぞ。
894仕様書無しさん:2011/02/06(日) 00:11:31
>>890-891
頭が固いなw いや悪いなか。

なんで例外にスタックトレース出力の機能があると思ってるんだ。
スタックトレースはデバッグのための情報だろ。
895仕様書無しさん:2011/02/06(日) 00:11:55
>>872
運用中にエラーの起きたファイル名、関数名、行番号なんぞ出してどうすんだ?

896仕様書無しさん:2011/02/06(日) 00:12:01
>>890 >>891 やっとまともな人が登場しました
897仕様書無しさん:2011/02/06(日) 00:12:46
0除算が起こる可能性のある箇所はgrepとかそういう話をする時点でズレてる
0除算が起こる可能性のある箇所は分母が0のときの動作を仕様で定義しなければならない
仕様がバグってるのにアプリ側で拾おうとするとか素人もいいとこだろ
組み始める前に計算式みて気がつかなきゃならないレベル
898仕様書無しさん:2011/02/06(日) 00:13:05
>>893
割り算をするための関数を使って、
場所を一箇所に集約したところで、

解決したい問題が、どこで割り算をする関数を呼び出したかに
変わるだけで、なんの問題解決にもなっとらんよ。
899仕様書無しさん:2011/02/06(日) 00:13:48
まともで頭が良い人たち
>>890
>>891

ぷっっっっっっっっっっう。ど馬鹿なのねな人
>>894
バグを追求するために例外があるわけじゃないのよん
900仕様書無しさん:2011/02/06(日) 00:14:12
>>887
0除算を静的解析で簡単に検出できるだって?
ほんとだとしたらあんたすげー大金持ちになれるよ。
901仕様書無しさん:2011/02/06(日) 00:14:13
>>897
> 組み始める前に計算式みて気がつかなきゃならないレベル

気づかないからバグが起きるわけで、
お前が言ってるのはバグがないソフトウェアを作ればOKと言っているだけ。

そんなものは現実に存在しない。
902仕様書無しさん:2011/02/06(日) 00:14:57
>>899
スタックトレースはバグを追求するための機能。
それが例外に追加されている理由を
考えたことがある?
903仕様書無しさん:2011/02/06(日) 00:15:26
>>901
バグをハンドルするためのコードにバグが入る可能性があるんじゃ意味ないじゃん。
むしろ余計なコードが増えた分、バグが余計に増えるわ。
904仕様書無しさん:2011/02/06(日) 00:16:02
>>898
呼び出し元の解析もできんのかね。そんなに割り算をするメソッドを
5000箇所ぐらいから呼び出しているようなシステムなのかい?
だっだめだ、笑いすぎて腹が痛い
905仕様書無しさん:2011/02/06(日) 00:16:42
>>903
例外処理のためのコードは
極めて少ないから、
バグの入る可能性は極めて少ないよ。

どちらが可能性が高いかの問題。
906仕様書無しさん:2011/02/06(日) 00:17:19
数日前から思ってたんだけど
今、議論してる奴等はレベルが低い
全然関係ない話に乗っちゃうし、問題の本質が見えてないから
普通に戻り値でも例外でも変わらないようなところにばっかり噛み付いて煽りあってる
907仕様書無しさん:2011/02/06(日) 00:17:49
>>904
割り算を沢山使用するシステムは
ありえないっていってんのか
908仕様書無しさん:2011/02/06(日) 00:18:20
>>898は自分が書いた0divのバグで心身共に衰弱状態におちいってないか?
俺でよければ相談にのるぞ
909仕様書無しさん:2011/02/06(日) 00:18:56
戻り値エラーだったら、そのエラーハンドルコードを
たくさん書かないといけないから
バグが入る可能性も高くなるんだよね。

この点は何も書かなくても適切なエラー処理をしてくれる
例外に分があるな。
910仕様書無しさん:2011/02/06(日) 00:19:28
バグを例外でキャッチするとかどこまで頭悪いの?
いままでエラーチェックでバグ拾ったコードなんて見たことあんのか?
バグをキャッチするソースなんて俺が糞認定してきた会社でもそこまでの超弩級の馬鹿はいなかった
お前等、おめでとう!文句なしの殿堂入りだw
911仕様書無しさん:2011/02/06(日) 00:21:10
>>907
使うよなあ。物によっては割り算多用するよ。
A/Dコンバートなんかのシステムの時には使ったなあ。
だけど0divは絶対起きなかったぜ。納品してから15年以上も立つがクレームに
なったことはないなあ。

あなたが組んだプログラムはあなたが組んだとおりに動作します。
0divが起こるのはあなたがそのように組んだからです。アーメン
912仕様書無しさん:2011/02/06(日) 00:21:33
今話してるのはリリース版において想定外のエラーに対処するために
一番上位の関数をcatch(Exception ex)で囲むか?ってことだよね。
913仕様書無しさん:2011/02/06(日) 00:22:05
>>904
メソッドのコールに至るパスが5000通りなら
別に珍しくもないと思うんだけど
何がおかしいの?
914仕様書無しさん:2011/02/06(日) 00:22:47
>>911
いや、俺が起きなかったから
他に人も起きるはずがないという考えでは。
トラブルを解決することはできなんか
一人で作るような小さいプログラムでしか通用しない理屈。
915仕様書無しさん:2011/02/06(日) 00:23:04
お前らほとんどが、例外が分かっていないだろう。
C++の例外も、それ以外の構造化例外も例外とはCPUの割り込み処理だ。
割り込みで一番やっては駄目なことは再度例外を発生させることだ。
エラー処理は戻り値でやれ、例外にエラー処理を書いてどうする。

ハードを知らない奴らにプログラムを書かせるからこうなるんだ。
自分が使っている道具(ツール)の特性ぐらい技術者なら覚えろ。アホ
916仕様書無しさん:2011/02/06(日) 00:23:41
>>912
別にデバッグ版でもいいよ。
デバッグ版だけスタックトレースを
ファイルに出力するような実装でもいい。
917仕様書無しさん:2011/02/06(日) 00:25:16
>>915は釣りとわかった上で
気づかないふりしてレスするようにw
918仕様書無しさん:2011/02/06(日) 00:26:10
>>916
デバッグ版ならデバッガ使えばいいじゃん
919仕様書無しさん:2011/02/06(日) 00:26:19
>>914
ループで呼び続けるようなシステムなら5000なんて即いっちゃうよねえ、たしかに。
仕様が見えないので想像でしかいえないけど、数値計算のシステムなら
確かに笑えないものはあるかな
920仕様書無しさん:2011/02/06(日) 00:28:34
>>918
デバッガ上で動かすのと
デバッグ版ビルドの実行は意味が違うぞ。
その区別ぐらいつけろよ。
921仕様書無しさん:2011/02/06(日) 00:32:14
>>920
gccでデバッグ情報アリでコンパイルすると
デバッガで実行して0除なんかで止まったときにどのファイルの何行目で止まったかわかる。
922仕様書無しさん:2011/02/06(日) 00:32:59
まとめ

例外厨は品質が悪く、バクが多いプロジェクにかかわっている
バグで困ったときに頼りにしているのが例外のスタックトレースだ
923仕様書無しさん:2011/02/06(日) 00:34:03
>>921
デバッガ上で実行しない場合は?

たしかデバッグ版で納品しろって怒られたやつが
上にいただろ?
924仕様書無しさん:2011/02/06(日) 00:34:50
>>922
そんなことやったって、
ということにしたいって
お前の願望が滲み出るだけだよ。
逆効果w
925仕様書無しさん:2011/02/06(日) 00:35:13
>>921
俺デバッグオプション嫌いなのよ。リリースビルドと動作が違う可能性が
あるし。物理的にバイナリがぜんぜんちがっちゃうわけでしょう。
デバッグバージョンで動作していたのに、リリースで動作しないっていう
話はありごとだよ。やっぱりしつこいけどシスログ最強
926仕様書無しさん:2011/02/06(日) 00:36:17
そして戻り値厨はシステムがダウンするまで
バグの気配に気付かないのであった
927仕様書無しさん:2011/02/06(日) 00:37:44
>>926
全部 void hoge()パターンで書く人ですねw
928仕様書無しさん:2011/02/06(日) 00:38:01
>>925
じゃあ、デバッグ版ビルドで例外使って
想定外の例外が起きたときに
シスログ出すようにすればいいじゃん。
ほら完璧w
929仕様書無しさん:2011/02/06(日) 00:38:53
これだけは言っとく。

関数の正常な戻り値とエラーの戻り値を
一つ戻り値に混ぜてはいけません。
930仕様書無しさん:2011/02/06(日) 00:39:23
>>928
うわぁ、やっぱりシンプルが一番。

デバッガをたよる技術者に切れ者なし
931仕様書無しさん:2011/02/06(日) 00:39:29
>>925
メモリ周りで起きるセグメンテーションフォルトなどの例外がデバッグオプションのあるなしで変わってきたりはするな。
そういうときはElectricFenceなんかのメモリ破壊検出ツールもあわせてテストするんだよ。
932仕様書無しさん:2011/02/06(日) 00:39:54
>>930
gdbディスってんのか?
933仕様書無しさん:2011/02/06(日) 00:41:11
>>931
メモリ破壊もクラッシュする位置さえわかれば即特定できるからいらないね。
ただ、ひでえ品質のシステムでC/C++のポインタがらみのバグがてんこもりの
やつでかつ再現性がないバグだったら俺は夜逃げします
934仕様書無しさん:2011/02/06(日) 00:42:27
Java使えば、メモリ破壊なんて
気にしなくていいのにw
935仕様書無しさん:2011/02/06(日) 00:43:28
>>932
初心者のころは世話になったな。しかし、効率が悪すぎるよ。>>932
神のように使いこなしているんだろうが、俺はめんどい。
ブレークポイントを的確にセットできたとしてもかったるいなあ
936仕様書無しさん:2011/02/06(日) 00:44:01
>>916
>>928
そこはリリース版でもログ出しとこうよ
バグなんだから
937仕様書無しさん:2011/02/06(日) 00:44:25
>>934
いや、俺は破壊しないけど、破壊王たちが作ったものをデバッグする気は
さらさらないのよ。てめえで直せってね。
938仕様書無しさん:2011/02/06(日) 00:45:11
いつしか例外スレは 「デバックテクニックスレ」になりました
939仕様書無しさん:2011/02/06(日) 00:58:47
例外はコードの記述量が
戻り値の場合よりも極端に少ないからな。

戻り値で想定外のエラーが起きたら
ログに表示するようにしておきましょう。
なんて大変なことが、簡単にできる。
940仕様書無しさん:2011/02/06(日) 01:18:26
例外をデバッグに使うというか、
異常事態が起きたことを
ログに出力しているだけなんだけどな。
それの何が悪い?
941仕様書無しさん:2011/02/06(日) 01:30:51
>やってはいけないこと
>例外を捕捉して、回復処理を何もしないで(ログ出力などでお茶を濁して)次の処理に移ってしまう
942仕様書無しさん:2011/02/06(日) 01:33:19
>>941
それは、正しい例外処理を行えってだけで
例外処理が駄目という話じゃないよ。
943仕様書無しさん:2011/02/06(日) 01:35:11
例外を全否定してるわけではないけど
944仕様書無しさん:2011/02/06(日) 01:52:01
http://www.bugbearr.jp/?C%2B%2B%2F%E4%BE%8B%E5%A4%96
こういう事書いてる人もいるから
945仕様書無しさん:2011/02/06(日) 01:54:25
>>944
ここにもたくさんいる。
だからどうした?
946仕様書無しさん:2011/02/06(日) 02:17:45
そういう書き方が気にいらない
947仕様書無しさん:2011/02/06(日) 02:20:39
気に入ってもらう必要なんて無いだろw
948仕様書無しさん:2011/02/06(日) 03:46:28
こう理解できない馬鹿にうまいこと教える術はないものか
949仕様書無しさん:2011/02/06(日) 04:25:10
理解する気がまるで無いのだから
たとえサルでもわかるように教えたって理解しないよ
950仕様書無しさん:2011/02/06(日) 10:49:26
長年戻り値でやってきた
プライドがあるんだろうな。
951仕様書無しさん:2011/02/06(日) 11:05:53
C++にfinallyが無いのが苦痛ならgotoで代用すればいいじゃない
bool error = false;
try { リソース確保(); } catch(...) { goto end; }
if (!error) {
try { リソース使った処理(); } catch(...) { goto end: }
}
end:
try { リソース解放(); } catch(...) { }
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を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。