トップページ⇒tech
391コメント121KB

エラーチェックがめんどくさい

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
エラーチェックとかエラーハンドリングってめんどくさいよな。
いちいち関数の戻り値とかチェックしてるときりがない。
おまえらはどうよ。
0002デフォルトの名無しさんNGNG
関数の戻り値チェックなんて古臭いな。
トレンドは例外・実行時エラーをキャッチだろ。
0003デフォルトの名無しさんNGNG
1はC厨
00041NGNG
>>3
おお、正解
0005デフォルトの名無しさんNGNG

例外は事前準備が面倒なんだよなぁ。

MFC使う場合は AfxUserException()、C++一般の
場合はSTLの例外クラスを派生させて
使うのが一般的なの?

0006デフォルトの名無しさんNGNG
インターネットがらみはエラーチェックをサボると
セキュリティホールになりかねないからヤバい
それ以外は仕様ですませれ
0007デフォルトの名無しさんNGNG
>>6
学生? 社会に出るまでに考えなおせよ。
そんな無責任ではプログラマに限らず商売できんぞ。

セキュリティホールもremote exploitableなものに限らんし。
0008デフォルトの名無しさんNGNG
例外ってさ、キャッチした後どうすんの?
0009デフォルトの名無しさんNGNG
場合によりけり。
0010デフォルトの名無しさんNGNG
華麗にスルー
0011デフォルトの名無しさんNGNG
エラーチェックをせずに、例外が起こったときにキャッチするのが
トレンドなんですか?
0012デフォルトの名無しさんNGNG
>>5
俺の場合名前だけ付けた空クラスとか空構造体にする
0013デフォルトの名無しさんNGNG
例外を投げている奴が既にエラーチェックをしているんだが、
>>11には小人さんの幻覚でも見えるんだろうか?
0014柳沢NGNG
>>8
もちろんスルー
昨日はヘッドで決めてやったけどな
0015デフォルトの名無しさんNGNG
へなぎの必殺のスルーパスがまた見たい
0016デフォルトの名無しさんNGNG
>>1
エラーチェック関数を作れ!
例外はTry Catchなどのクラスを使え!
エラーチェックはプログラムを作る最低限の常識
面倒って言うなら、エラーが出ないように作れ!
だか、ユーザーはどんな行動をおこすか不明だから、
エラーが出ないようにするのは不可能!
よって、仕様レベルでどこまでエラーチェックするかどうかって事だ!
クソスレ立てるなYo。だから氏ね
0017デフォルトの名無しさんNGNG
Tryってクラスなんだ
制御構造じゃなくて
0018デフォルトの名無しさんNGNG
チャレンジ精神
0019デフォルトの名無しさんNGNG
てっきり家庭教師を派遣するところだと思ってた。
0020デフォルトの名無しさんNGNG
勉強すればこのスレも
A girl
0021デフォルトの名無しさんNGNG
とりあえずASSERTを使えと書いてあるが、
なんのことやらわからなかったり。
0022デフォルトの名無しさんNGNG
エラーチェックでassertとは・・・
0023デフォルトの名無しさんNGNG
ASSERTはデバッグ用
0024デフォルトの名無しさんNGNG
VBだとメモリの開放も自動でやってくれてメモリ内のデータぐしゃぐしゃで
システムをやられてしまうこともありませんよ
0025デフォルトの名無しさんNGNG
↑みたいないいかげんな考えのVB厨が組むと、ずっと動きっぱなしの
アプリとかでメモリリークが深刻な問題になっていく
0026デフォルトの名無しさんNGNG
別にVBだけじゃなくてJavaやC#も一緒。
0027デフォルトの名無しさんNGNG
>>26
おまいは読解力ゼロか?
別にVBが駄目と言ってるんじゃない。
それを使う奴の問題意識の話だ。
0028デフォルトの名無しさんNGNG
>>24
データベースセッションとかセッション系などは開放されねぇよ!
うすら禿げ!
いいかげんなこと言うな!
0029デフォルトの名無しさんNGNG
セッション系の開放を GC に頼るやつはアホ。
0030デフォルトの名無しさんNGNG
>>28
メモリの解放としかいってないだろ。
003128NGNG
>>30
サーバーにもクライアントにもメモリに残ってしまいますよ。

>>24さんは、
VBだとメモリの開放も自動でやってくれて…って述べてまふ。

うすら禿げ!はいい過ぎですた。スマソ。
0032デフォルトの名無しさんNGNG
> サーバーにもクライアントにもメモリに残ってしまいますよ。
主語がねーぞw
0033デフォルトの名無しさんNGNG
盛り上がってまいりました
0034デフォルトの名無しさんNGNG
や、やめてくれ兄貴!
頼むから殴らな○▽※♂♀
0035デフォルトの名無しさんNGNG

C++は例外使うとメモリリークが怖いよなぁ。

これを避けるためにコンストラクタで資源確保
とか言われてるけど、かなーり手間だと思うんだが。

0036デフォルトの名無しさんNGNG
メモリリークが起こってきたら、実行ファイルからこっそり謎のドライバを取り出し、
KeBugCheck()させて、ぼかーん
0037デフォルトの名無しさんNGNG
コンストラクタでの資源確保は基本的にやらない。
InitとかCreateといった名前の関数を作って、初期化はそこでやる。
もちろん解放もデストラクタではなく、解放用の関数を作って明示的に呼ぶ。
0038デフォルトの名無しさんNGNG
[・∀・]フムフム
0039デフォルトの名無しさんNGNG
つーかふつーコンテナ使わないか?
0040デフォルトの名無しさんNGNG
コンテナでいかようにしますか?
漏れは>>37派なわけだが
0041デフォルトの名無しさんNGNG
メモリリークって、どうやって直すの?
C++でnewつかうとバグするプログラムで、
Win32APIのメモリ関数にしたら、バグらなくなった。
0042デフォルトの名無しさんNGNG
>>41
千差万別。結局のところソースを見ないと解決しない。
ソースをうpしてみれ。
0043デフォルトの名無しさんNGNG
>>41
バグらなくても、そういうのは、
なんとなくこわいな。(w
0044デフォルトの名無しさんNGNG
> C++でnewつかうとバグするプログラムで、
> Win32APIのメモリ関数にしたら、バグらなくなった。

この主張がまず意味不明。
0045デフォルトの名無しさんNGNG
やってることは大体同じなのにな。
0046デフォルトの名無しさんNGNG
コンストラクタかデストラクタでいけないことをやってるに1000ガバチョ
0047デフォルトの名無しさんNGNG
>>37みたいなアフォ氏んでくれんかな。
理由もなしに俺ルールつくんなよ。
0048デフォルトの名無しさんNGNG
初期化関数はいいとして、開放関数はやめれ
0049デフォルトの名無しさんNGNG
解放関数ってデストラクタに入れね?
明示的に呼ぶこともできるようにして。
0050デフォルトの名無しさんNGNG
漏れは>>37とは他人だが>>37は正しい。
何のためにprotectedやprivateがあると思ってんだ?

もし、>>47-48がマジレスしてるのであれば哀れだぞ。
そうでない事を祈る。当然、釣りだよな?
0051デフォルトの名無しさんNGNG
そんな機能分割といったような実装面の話はしてないだろ
0052デフォルトの名無しさんNGNG
> 何のためにprotectedやprivateがあると思ってんだ?
そんなもんここでは全く関係ない話。
0053デフォルトの名無しさんNGNG
まぁ、スタイルは人それぞれだしなぁ
005450NGNG
>>51-52
額面通りにしか文を読めないんだな。

データトレースすべき位置を絞り込む
効果も期待できるって事が判らんのか?

>>47は、STLコンテナ未経験者だろ?
0055デフォルトの名無しさんNGNG
何が言いたいのかわからんから、
遠まわしに言わないで直接言ってくれよ。
0056デフォルトの名無しさんNGNG
コードで示せっての
0057デフォルトの名無しさんNGNG
そう、僕らはコードで会話するのだ
0058デフォルトの名無しさんNGNG
コード
0059デフォルトの名無しさんNGNG
コード
0060デフォルトの名無しさんNGNG
コード、コードコード?
0061デフォルトの名無しさんNGNG
コンストラクタやデストラクタで資源確保・解放をするなと
言っている人は例外の正しい使い方を知らないんだよ。

コンストラクタで資源確保して何がいけないの?と聞けばすぐわかる。
変なことしか言えないか、答えられないかのどちらかしかない。
さてなんて答えるか聞いてみよう。答えてね。>>50

> データトレースすべき位置を絞り込む
> 効果も期待できるって事が判らんのか?
なにを絞り込めるんだかw
エラーが発生する個所が移動するだけじゃん。
それからアサートって知ってるか?w
0062デフォルトの名無しさんNGNG
> それからアサートって知ってるか?w

ナムコから出てた2レバーのやつですね。
0063デフォルトの名無しさんNGNG
逃げた?
0064デフォルトの名無しさんNGNG
>>61
おまいさんが言いたいのはコンストラクタで資源確保に失敗しても
例外を投げればエラーに対処できるってことか?
残念ながら場合によっては悲惨なことになるぞ。

コンストラクタで二つ以上の資源確保するとするよな。
一つ目は無事成功、二つ目で確保失敗して、例外ハンドラに制御が移る。
そうすると一つ目の方の資源解放ができんわけだ。
目的のクラスも作られなかったわけだから、デストラクタもdeleteも無理。
で、めでたくメモリリークだ。わかるか?
0065デフォルトの名無しさんNGNG
例外を投げる前に既に確保されたリソースをクリーンアップしたらいいのではない?
0066デフォルトの名無しさんNGNG
AClass:AClass()
try : A()/*may be throw*/, B() {
 try {
  initialize(); /* may be throw*/
 }
 catch(...) {
  cleanup();
  throw;
 }
}
catch (..) {
 cleanup();
}

こんな感じじゃダメなのか?
0067デフォルトの名無しさんNGNG
>>64
複数の資源を単一のオブジェクトで管理しようとするのがアフォ。
0068デフォルトの名無しさんNGNG
>>65-66
スマソ、それでいけるな
例外についてわかってないのは漏れでした
0069デフォルトの名無しさんNGNG
そういうの(>>66みたいなの)はイマイチよろしくないから
スマートポインタみたいなの(要は、個々の資源の確保と解放に責任を持つ物)を
メンバーにするやり方がよろしい。


と、More Effective C++に書いてあった。
なぜイマイチよろしくないのかは、


忘れた。
0070デフォルトの名無しさんNGNG
>>69
例外の発生原因はメモリ確保だけじゃないですよ
というか、>>66がよくないのはMore Effective C++が執筆された当時
まともにサポートしてるコンパイラがあまり無かったからだろう
0071デフォルトの名無しさんNGNG
意味分かってんのか?
例外が発生したときに資源を解放できないことが問題なんだろ?

例外の原因がメモリ確保にあるかどうかなど関係ない。
それに解放すべき「資源」がメモリだけではないのも当然。
0072デフォルトの名無しさんNGNG
意味っていうか、問題の「本質」ってやつだな。

コンストラクタの途中で例外が発生しても(←何故か例外の発生げいいんを問題にする奴もいる)
メンバーが確保(しようと)している資源をリークさせず確実に解放するために
スマートポインタを使い、fstreamを使う。
0073デフォルトの名無しさんNGNG
鯨飲って・・
0074デフォルトの名無しさんNGNG
←なぜか変換できないのガイドライン
http://that.2ch.net/test/read.cgi/gline/1074839941/
0075デフォルトの名無しさんNGNG
つーか、>>66って、ただのネストしたtry catchだと思ってたけど
ちょっと見たことない形だし
>>70の言葉からしてもなんか特殊な構文なのかな?
だとしたら俺の勘違い。

More Effective C++で触れられているのは
・constなポインタ等、コンストラクタの初期化リストで初期化したい
・そのためには別のinit()とcleanup()が必要
・さらに、複数のメンバーの確保順を把握しながら、確保/例外/解放処理を書く必要があるため
 保守上の問題がある
が理由として挙げられている。
実際、こんなクラスにメンバーを追加したりするのは、俺も嫌。

そこで、「初期化されたメンバーのデストラクタが必ず呼ばれる」事を利用した
資源の確保/解放専用クラス(スマートポインタ等を含む)を利用すべき
となる。
0076デフォルトの名無しさんNGNG
なんかいつの間にかコンストラクタで例外が発生しても
良いということが前提になって話がすすんでいるな。

いや、まあ当然のことなんだけど。

んでコンストラクタで例外が発生した場合に
資源を管理しやすくするためにスマートポインタ等を使えと。
0077デフォルトの名無しさんNGNG
MFCのCFileとかに苦しめられた事のある人いる?

「例外スローすりゃ綺麗!!」程度の認識で
クラスを作られては、たまらんよ。

作った本人は自己陶酔に浸れていいかもしれんが、
他人がそれを2次利用する事をちゃんと想定しているのかな?
0078デフォルトの名無しさんNGNG
>>77
なにに苦しめられたの?
エラー番号チェックから例外に変わっているだけでも便利だと思うけど。
0079デフォルトの名無しさんNGNG
盛り上げ
0080デフォルトの名無しさんNGNG
>>78
>なにに苦しめられたの?
ハンガリー記法
0081デフォルトの名無しさんNGNG
使わないと言う選択肢もあるのにわざわざ使うのかね
0082デフォルトの名無しさんNGNG
MSってハンガリーなところと、
全くそうでないところとかあったりするよな。
0083デフォルトの名無しさんNGNG
>>76
boost::scoped_ptr あたり使っとけば、特に何もしなくてよろしいということでしょうか?
0084デフォルトの名無しさんNGNG
>>80
なんだ。ただの変数名のルールに苦しめられたのか。
俺はてっきり例外あちこちに飛んで意味分からん。
戻り値チェックでいいじゃん。
とか低レベルなこと言うつもりなのかと思ったよ。
0085デフォルトの名無しさんNGNG
>>78
>なにに苦しめられたの?
lpsz
0086デフォルトの名無しさんNGNG
で、俺は75なのだが、>>66の構文ってただのネストしたtry..catchとは違うの?
ぱっと見で、throw()指定とも違うし
なんとなく初期化リストでの初期化時の例外をcatchしてるように見えるけど

>>70はわかってるっぽいし
出来たらちゃんとコンパイルできる形式でのサンプル希望
0087デフォルトの名無しさんNGNG
>>66の通りに適当に実装すればいいだろ
ウチはVC6だからか、コンパイルすら通らないけど
0088デフォルトの名無しさんNGNG
いや、俺もVC6とBCC5.6.4で試して、どうやっても通らなかったから。
008988=75NGNG
で、>>68もなんか納得してるし、>>70も当時はサポートされてないものが多かったって言ってるし
0090デフォルトの名無しさんNGNG
#include <iostream>

struct A
{
 A(int i) { throw i; }
};

struct B
{
 const A a;
 B() try : a(0) {
 }
 catch (int i) {
  std::cout << i << std::endl;
 }
};

int main()
{
 try {
  B b;
 }
 catch (int i) {
  return i;
 }
 return 0;
}

これで通った(gcc3.3.1)
009188=75NGNG
とりあえず俺もぐぐってこんなのを見つけた
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpdndeepc/htm/deep102199.asp
009288=75NGNG
で、そういう構文があるってのは納得(>>90はVC6,BCC5.6でやっぱり駄目だった)
かなり後に構文が追加されたとなっているので
今のところgcc3.3とかVC7とかじゃないと動かないのかな。

複数メンバーの初期化時の個別catchとか、調べてみたいこともいろいろあるけど
実際に常用環境を移行するようになってから試してみるようにする。

どうもありがとう。
0093デフォルトの名無しさんNGNG
括弧のインデントのとり方がマニアックすぎる
0094デフォルトの名無しさんNGNG
添削キボンヌ
0095デフォルトの名無しさんNGNG
つーかC++ウザ
0096デフォルトの名無しさんNGNG
>>95
ある意味正しい。C++はなんでも出来てしまう。
コーディング規約を意図的に作らない限り、泥沼に入る言語だ。

だが、C++を否定しようとするヤシは、C++に負けたヤシだとも言える。
C・C++プログラマからすれば、こういうヤシは失笑モノだ。

心底C++を否定したいヤシもいるかもしれんが、
人前では言わない方がいい。
「あぁ、コイツはその程度か」と思われるだけだからだ。
0097デフォルトの名無しさんNGNG
失笑ねぇ
0098デフォルトの名無しさんNGNG
>>96
例の禿げが、C++の否定したらしい話があるらしいけど、ホントだったらどうするよ?
0099デフォルトの名無しさんNGNG
カトラーたんもC++否定派だね
流出ソースのカトラーたんの署名があったソースは全部Cだったらしいし
0100デフォルトの名無しさんNGNG
うんこを使いこなすにはスキルが要るのは確かだが、
無駄なスキルだわな。。。そんなスキル自慢されてもねぇ。
つーか、Cまで一緒にすんな。
0101デフォルトの名無しさんNGNG

>>96 が失笑を買っています。
0102デフォルトの名無しさんNGNG
>>98
どっかのサイト(URLに"joke"が含まれてた)に載ってたな
0103デフォルトの名無しさんNGNG
>>96の正体
      ─、、
    (゚皿゚ O) ガオー!
    / ̄/ >>
    | ̄|  | |
   @/\ \@/
     /'/ /'/
     | |  | |
    -┛ -┛
0104デフォルトの名無しさんNGNG
>>90の構文には驚いた。
いつの間にかメタモルフォーゼしてるし。
ここまで変えるなら、言語ごと変えた方がいいだろとか思ったり。
tryキーワードを付ける意味ねー。やっぱC++ウゼぇ
0105デフォルトの名無しさんNGNG
http://hp.vector.co.jp/authors/VA000092/jokes/strup.html
Bjarne Stroustrup Interview about C++

これ?
0106デフォルトの名無しさんNGNG
おまえらPCばっかやってないでたまには異性とデートでもしてこいよ
0107デフォルトの名無しさんNGNG
>>106
ついバレンタイン数日前に振られたあげく、13日に家に帰ってきたら義理チョコが家においってあってかなり凹みましたが何か?
さっさと荷物かたづけてかぎかえしやがれってんだ。
0108デフォルトの名無しさんNGNG
>>107
> 家においってあって
ここのところの説明をお願いします。
0109デフォルトの名無しさんNGNG
>家においってあって
疲れてたから、単なる誤字だ。せいぜい警告程度だろうが
0110デフォルトの名無しさんNGNG
C最高!!
0111デフォルトの名無しさんNGNG
>>104
つける意味はあるんじゃないのか?
スマートかどうかはともかくとして。
0112デフォルトの名無しさんNGNG
初期化リストとか関数ごとtry指定の構文がうぜえってのは同意だな
0113デフォルトの名無しさんNGNG
おい。俺んちには「プログラミング言語 C++ 第三版」が
あるんだがこれにC++の仕様全部書いてあるよな?
0114デフォルトの名無しさんNGNG
>>113
書いてない。
0115デフォルトの名無しさんNGNG
>>113
うちにもあるけど、だいたい網羅してると思うが。
ただ読みにくいね。何章も前の例題を後の章で
引きずってるから、拾い読みができない。
0116デフォルトの名無しさんNGNG
>>114
書いてない仕様を教えてくれ。
0117デフォルトの名無しさんNGNG
青菜に仕様
0118デフォルトの名無しさんNGNG
おい。俺んちには「gcc バージョン3.3のソース」が
あるんだがこれにC++の仕様全部書いてあるよな?
0119デフォルトの名無しさんNGNG
ここは、言葉遊びがしたい厨が集まるスレですか?

C++の仕様を覚える必要などナシ!
そんな事よりも藻前のコンパイラが吐く警告・エラーに対処しろ。
ANSIC++完全準拠コンパイラなど存在しない。
0120デフォルトの名無しさんNGNG
規格は到底覚えきれんけど、知らんうちに未定義なコードを書きまくって
鼻から何か飛び出してから慌てるのもあれなんで、未定義になるコードの例を
いくつか覚えておくといい。
0121デフォルトの名無しさんNGNG
>>119
おいおい。覚えないために本があるんだろ。
0122デフォルトの名無しさんNGNG
>>116
>>121
> おい。俺んちには「プログラミング言語 C++ 第三版」が
この本は規格書ではない。
特にテンプレート周りは規格書をみないとわからないことが多い。
0123デフォルトの名無しさんNGNG
ISOの例の奴の邦訳じゃないの?
0124デフォルトの名無しさんNGNG
ISOのアワビの片思い
0125デフォルトの名無しさんNGNG
俺が作ったプログラムはエラーなんかでないから
エラーチェックなんぞしない。
0126デフォルトの名無しさんNGNG
他人様が作ったプログラム(API)がエラーを返すから
エラーチェックをするんだろうがよ
0127デフォルトの名無しさんNGNG
他人が作ったプログラムを利用している時点で(ry
0128デフォルトの名無しさんNGNG
戻り値チェックを義務付け!!
0129デフォルトの名無しさんNGNG
>>1
クラスの作り方も知らないからこうなるんだよ(ワラ
0130デフォルトの名無しさんNGNG
非クラス三原則

作らない 作らせない 持ち込ませない
0131デフォルトの名無しさんNGNG
>>125 のプログラムは
エラーを出す前にコケるそうです。
0132デフォルトの名無しさんNGNG
例外ってマジで使い道わからんよ。
普通のアプリケーション作ってて、対処しなければならないエラー処理って
>>126のようなAPIの戻り値ぐらいじゃん。
こんなのって復旧のしようが無いよ。
結局そのまま上に例外をスルーさせるか、エラーメッセージだして強制終了させる
ぐらいしか出来ない。
0133デフォルトの名無しさんNGNG
>>132
> 結局そのまま上に例外をスルーさせるか、エラーメッセージだして強制終了させる

それも十分な使い道じゃん。
いちいちエラーコードチェックしなくて良いんだし。
0134デフォルトの名無しさんNGNG
>>133
エラーコードチェックしなけりゃ問題だろ。
手抜きプログラムだ
0135デフォルトの名無しさんNGNG
>>134
エラーのチェックはしても、いちいちする必要は無いじゃん。
tryブロックの中で発生した例外は皆同じ catch に行くんだし。
ファイルの入出力とかの時便利よ。
0136デフォルトの名無しさんNGNG
>>135
やはり手抜きじゃないか。
エラーってのは、こう慎重にな、何が悪いのか、ちゃんと
エラー復旧処理はちゃんとできるのか、エラーが起きたときの情報を
ちゃんと得られるのかってとっても丁寧にやらなきゃいけないんだぞ。

皆同じcatchにいってそれができるのか?
エラーが起きたときのファイル名とかちゃんと取得できるのか?
0137デフォルトの名無しさんNGNG
なんつーか、
ある関数の中で、あるルーチンAが実行時エラーを起こしたので
例外を投げて別のルーチンBで処理した。
みたいなことやれたらスマートだと思うんだなあ。
0138デフォルトの名無しさんNGNG
>>136
ファイル名(や他の情報)が欲しければそれが取れる位置にcatchを書くか
例外オブジェクトに持たせればよいと思いまつ。
0139デフォルトの名無しさんNGNG
>>137
catch でルーチンBを呼び出すのではいかんの?

俺もCFileで、ファイルがないくらいで例外投げるのマンドクセと
思ってたけど、最近は PathFileExists でファイルを確認してから
開くようにしてるので、CFileも tryブロックで囲まなくなった。

0140デフォルトの名無しさんNGNG
わざわざ例外オブジェクトにもたせないといけない時点で糞だな。
0141デフォルトの名無しさんNGNG
>>139
おい。PathFileExistsでファイルを確認した後で
ファイルがなくなったらどうするんだ!?
0142デフォルトの名無しさんNGNG
CFileの引数つきコンストラクタは使うな。
以上。
0143デフォルトの名無しさんNGNG
>>139
マルチタスク環境の経験ないの? DOS?
0144デフォルトの名無しさんNGNG
>>142
馬鹿ですか? 糞ルールつくんな。禿げ。
0145デフォルトの名無しさんNGNG
>>141
そんな稀なケースまで考慮する必要あるかなぁ?
マルチタスクだから理屈としてはあり得る話だけど。
0146デフォルトの名無しさんNGNG
>>145
そういうのが稀じゃなく起こる仕事もあるってことさ。
0147デフォルトの名無しさんNGNG
少なくとも基幹部分には使えんな。
0148デフォルトの名無しさんNGNG
>>132
少なくともドライバでは使い道があるぞ。
ブルースクリーンを回避できるからな。
0149デフォルトの名無しさんNGNG
>>146-147
なるほど。
それじゃ try 使うしかないか。
0150デフォルトの名無しさんNGNG
tryつかわんでも実行して帰ってきた
エラー値で判断すりゃ良いじゃん。
0151デフォルトの名無しさんNGNG
 ∧_∧
( ´∀`)< ぬるぽ
0152デフォルトの名無しさんNGNG
>>151
do {
 セルフサービス;
} while (1);
0153デフォルトの名無しさんNGNG
do {

 ∧_∧
( ´∀`)< ぬるぽ

} while (1);
0154デフォルトの名無しさんNGNG
try{ if( >>151 == ぬるぽ )throw Ga( >>151);}
catch( Ga ga){ ga.ガッ( >>151);}
0155154NGNG
間違った・・
0156デフォルトの名無しさんNGNG

MFCで使う場合の例外って、1つはSTLで使われる
exception とその派生クラスの例外と、もう1つは
MFCのCException とその派生クラスの2系統が
あるんだっけ?

例外を派生させなくてもいいという意見もあるけど、
基底クラスでcatchすることを考えると、やっぱ
派生させて構造化した方がいいと思うんだけど、
あんまり解説してる本多くないんだよな。
0157デフォルトの名無しさんNGNG
ところで>>1を叩いてる奴に質問なんだが、
お前らはエラーチェック面倒くさいの? どうなの?
0158デフォルトの名無しさんNGNG
>>157
エラーチェックするのはコンピュータだから、俺は面倒だとは思わない。
0159デフォルトの名無しさんNGNG
エラーチェックをするようにコンピュータに指示するのは漏れだから、やはりめんどいように思う。
0160デフォルトの名無しさんNGNG
>>159
エラーチェックは面倒くさくないが、
起こってしまったエラーのリカバリの
扱いはめんどくさい。
0161デフォルトの名無しさんNGNG
例外を使えば、関数の返り値の型にとらわれず、
好きな型を返せるってのはダメ?
0162デフォルトの名無しさんNGNG
でも、例外って使うと二度手間三度手間になるんだよな
try {
 FILE* fp = fopen("abc.txt", "r");
 if (fp == NULL)
  throw exception();
} catch (...) { }

これじゃエラーチェックしてgotoしてるのと変わらんし。

try {
 FILE* fp = my_fopen_with_exception("abc.txt", "r");
} catch (...) { }

これだといちいち関数作らないとならないし。
出来合いのものといっても、事実上boostしか標準的な選択肢が存在しないからな。
0163デフォルトの名無しさんNGNG
>>162
fopenは直接使う機会が多そうだけど
ヒープメモリとかはどうよ。
エラー判定を内包する事が多いんじゃないか?

obj create(size) {
 void *r = malloc(size);
 if (!r) throw badallocate;
 return (obj)r;
}
0164デフォルトの名無しさんNGNG
>>96
> >>95
> ある意味正しい。C++はなんでも出来てしまう。
> コーディング規約を意図的に作らない限り、泥沼に入る言語だ。
>
> だが、C++を否定しようとするヤシは、C++に負けたヤシだとも言える。
> C・C++プログラマからすれば、こういうヤシは失笑モノだ。
>
> 心底C++を否定したいヤシもいるかもしれんが、
> 人前では言わない方がいい。
> 「あぁ、コイツはその程度か」と思われるだけだからだ。


それはCOBOLを否定されたCOBOLerが僻みと同じだろうよ。
吾輩は人前ではよくいう。
だが、全面否定はしない。「こういうことするにはC++のこの部分が〜悪い」
という言い方で否定しているにすぎない。

全面否定してしまっていてはOSにC++を使ってはいけないと言うことになり、
数々のOSを否定することになるからだ。
0165デフォルトの名無しさんNGNG
>>107
> >>106
> ついバレンタイン数日前に振られたあげく、13日に家に帰ってきたら義理チョコが家においってあってかなり凹みましたが何か?
> さっさと荷物かたづけてかぎかえしやがれってんだ。

そのうちその女の悪友に鍵のコピーが回って泥棒に入られるぞ。
鍵をコピーされているかもしれんから。
今のうちに錠前も別のものにしておけ。
0166デフォルトの名無しさんNGNG
>>162
C++で例外にすら対応していない旧式のCの関数使っているからじゃんw
0167デフォルトの名無しさんNGNG
>>1
そんなあなたにアスペクト指向。
0168デフォルトの名無しさんNGNG
>>166
別にfopenに意味があるわけじゃないから、
fopenじゃ無くてOSのシステムコールでもいいんだけどね。
分かりにくい例を出しても仕方ないし。
0169デフォルトの名無しさんNGNG
そういえば、エラーとか例外の場所を出力するにはどうすれば?

VCでは__LINE__と__FILE__マクロが使えるけど。
0170デフォルトの名無しさんNGNG
C99対応なら__FUNCTION__も使えば完璧
0171デフォルトの名無しさんNGNG
自分でthrow投げるならともかく、
他のとこの発生場所ってわかるの?
デバッグ情報使わない?
0172デフォルトの名無しさんNGNG
>>168
C++で例外にすら対応していない旧式のOSのシステムコールを使っているからじゃんw


WinFXのような例外に対応しているOSのシステムコールなら無問題
0173デフォルトの名無しさんNGNG
>>172
あっそ、それでおまえはWinFX使ってるわけだ
0174デフォルトの名無しさんNGNG
>>173
正式リリースしてないのに使っているわけ無いじゃん。
でも例外に対応しているので無問題なのは確かですよ。
0175デフォルトの名無しさんNGNG
WinFXは例外を使用する
C言語は例外を使えない。
C言語が使えないOSはOSと認められない。

ゆえにWinFXがAPIであるLonghornはOSとは認められない。
0176デフォルトの名無しさんNGNG
>>169
別に、MS独自マクロではない。ANSI-Cマクロ。
但し、__FILE__は展開されるファイル文字列の仕様が
まちまちなので(ファイル名orフルパス名など)注意。
0177デフォルトの名無しさんNGNG
>>174
OSが独自の例外機構をもっていることとC++言語が対応していることは等価ではないよ
Win32のSEHは、VC++を使えば捕捉できるけど、BCでは捕捉できない。
それにWinFXはManagedC++以外でも使えるのか?
オブジェクト型とか既存のC++と互換性があって、実装も互換性が有るの?
0178デフォルトの名無しさんNGNG
>>175
C++はCを包含している。従って、
「C言語が使えない」
という表現自体がありえない。
0179デフォルトの名無しさんNGNG
>>178
C言語でどうやって例外を扱うのでしょうか?w
0180デフォルトの名無しさんNGNG
>>179
現実を見ようよ
0181デフォルトの名無しさんNGNG
つまり>>178がいいたいことは、
C++はCを包含しているために、
C++を使えばCで例外を使用できる。

と。C++を使えば・・・あれ?(激藁
0182デフォルトの名無しさんNGNG
VCだとC言語モードでも__tryとか使えるよ>>179
0183デフォルトの名無しさんNGNG
所詮言語拡張
0184デフォルトの名無しさんNGNG
>>183
別にいいんでわ?
わざわざインアセ使うところを拡張構文にしてすっきりさせてるんだし。
0185デフォルトの名無しさんNGNG
Cのみにこだわるヤシは、goto大好きっ子
0186デフォルトの名無しさんNGNG
大好き
0187デフォルトの名無しさんNGNG
>>177
既存のC++とか言っている意味が良く分からんけど、
C++に使用できる外部ライブラリの形式(.dllとか.oとか)の
規定があったか?

外部ライブラリがあってそれをどうサポートするかは処理系次第だろ。
0188187NGNG
最後の行ちょっと修正

外部ライブラリがあってそれをどうサポートするかは
元から処理系次第だろ。
0189デフォルトの名無しさんNGNG
そういやlinuxとかだとC++のsharedライブラリに簡単に作れるのに
Windwosだとちょーめんどくさくね?
逆にlinuxとかだと実行ファイルのパス名取得する程度の事が
ちょーめんどくさい。
OS文化が違うんだな。
0190デフォルトの名無しさんNGNG

goto も使えた方がいいけど、
java みたいに break と continue にラベルを指定
できるともっといいな。
0191デフォルトの名無しさんNGNG
gccみたくラベルアドレスを保存してテーブル化できるとなおいいね。
でもgccはgasがキモイ。
世の中うまくいかんね。
0192デフォルトの名無しさんNGNG
10 goto 行番号

こういうのが好きだ。大好きだ。
0193デフォルトの名無しさんNGNG
>>192
20年前に生まれてればよかったね
0194デフォルトの名無しさんNGNG
>>193
え?20年前に生まれたら、今年20才。
(´∀`)「C#をアカデミックパックで覚えますた。」
とか言い出しそうだ。
0195デフォルトの名無しさんNGNG
>>194
ご自分のお歳を+20加算してください
0196デフォルトの名無しさんNGNG
>>195 why?
0197デフォルトの名無しさんNGNG
>193が
「20年早く生まれていれば良かったね」
になっていないのが悪いな。
0198デフォルトの名無しさんNGNG
ようするにきっちり20歳でなければならないわけだな。
0199デフォルトの名無しさんNGNG
>>193
ゼロとなる位置が初期化されてなかった事が問題だな。
ゼロ位置に何が入るかは、文章を読む人に依存してしまうので、
ランタイムエラー。

int main()
{
 int pos;
 pos -= 20;
 printf("%d\n", pos);
 return 0;
}
0200デフォルトの名無しさんNGNG
例外機構って、まんまsetjmp・longjmpなんだよなあ
わかりづらすぎ

0201デフォルトの名無しさんNGNG
>>200
自分の勘違いが結論ですか?w
0202デフォルトの名無しさんNGNG
例外が発生しそれに対して処理後に、また例外を発生させた次の行からはじまってくれればなぁ・・・
0203デフォルトの名無しさんNGNG
rubyでも使ってろ
0204デフォルトの名無しさんNGNG
>>202
try {
  例外が発生した行
} catch {
  処理
}
  次の行
0205デフォルトの名無しさんNGNG
手続き型言語には似合わない
0206デフォルトの名無しさんNGNG
そも、例外処理に期待するプログラムってのもな。


予測に対処するという意味で使用するならわかるんだが、
どーもそうではないような書き込みが。
0207デフォルトの名無しさんNGNG
『例外』って名前が悪いんだな。
Exceptionがthrowされるのは別に*例外的*なことじゃなくて、
エラーが起きた場合だってだけなのに。

try ... catch の catch節に書くのは*予測*されたエラーの処理だ。

いちいち戻り値をチェックするのが面倒だからException使うんじゃん。
0208デフォルトの名無しさんNGNG
ほとんどの場合正常終了だから異常終了するのは*例外的*なこと。

そのなかでも復旧可能なものが Exception で不可能なものが Error だと
(俺は) 思っている。

>いちいち戻り値をチェックするのが面倒だからException使うんじゃん。
これは同意するが

>try ... catch の catch節に書くのは*予測*されたエラーの処理だ。
これは同意しない。
「例外的」という言葉と「予測」という言葉は別に直交しない。
0209デフォルトの名無しさんNGNG
親に投げるってのがどうにも意味不明だな>例外処理
制御乱してどうすんだよ
復旧できるならその場で復旧すべきだろ
設計したやつは頭悪いね
0210デフォルトの名無しさんNGNG
>>209
>復旧できるならその場で復旧すべきだろ
その通り。
例外機構はその場で復旧できないエラーを処理するために在る。
0211デフォルトの名無しさんNGNG
いまだに例外分かってない奴がいるんだなぁ。

たとえばデータベースへの接続。
接続する前に接続に失敗するかどうかなんてわからん。
それに接続に失敗したら、画面に必ず接続に失敗しましたと表示される
connect()関数なんて使いたくないぞ。エラー結果を親に返すのは当然だろ。
0212デフォルトの名無しさんNGNG
それは例外でなければ実装できないものなのかと
0213デフォルトの名無しさんNGNG
>>212
その通り。
0214デフォルトの名無しさんNGNG
戻り値の場合、エラーを返すのに戻り値を使ったら
戻り値をエラー以外に使えなくなっちゃ苦からなぁ。

なんかの値を返す関数の内部でエラーを返す関数を
使うだけでもう破綻してしまう。
0215デフォルトの名無しさんNGNG
多値を使えるようにするとか。
・・・そういう問題じゃないな。

Cとかの場合は引数側にポインタ渡しで出力するよね。
あれがいまいち気に食わない。
in|out|inoutをソースコードとは別にドキュメント化しないといけないし。
0216デフォルトの名無しさんNGNG
itron は戻り値がエラー値だな。
全部かどうか忘れたけど、ほとんどそうだったような…
これはこれで好きなんだけどなー。
0217デフォルトの名無しさんNGNG
values(int,int) f() {
 return values(1,2);
}

main() {
 int a,b;
 receive(a,b) from f();
 printf("a=%d, b=%d\n",a,b);
}

うぐぅ・・
0218デフォルトの名無しさんNGNG
COMもCからみたら戻り値はほとんどエラー値用だな。
必要な値を返す戻り値は引数になっている。

もちろん他の言語からは、エラーは例外になって
必要な値が戻り値に変換されるが。
0219デフォルトの名無しさんNGNG
>>215
inとout/inoutはconstをつけるかどうかで明示できるけど
outとinoutの識別は難しいな。C++なら、
template <typename T>
struct Out_ptr {
    struct ref {
        ref(T &r):r(r){}
        operator=(const T &t){r=t;}
        T &r;
    };
    ref operator*(){return ref(*p);}
    T *p;
};
こういうので何とかならないこともないが。
0220デフォルトの名無しさんNGNG
戻り値方式はエラーをサボるからいけない。
ちゃんとprintfのエラー処理しろよ。
エラーが起きたのに処理続行されても良いのか?
0221デフォルトの名無しさんNGNG
>>220
良いからサボるわけで。
0222デフォルトの名無しさんNGNG
>>221
それはエラーが起きても無反応で良いということか?
エラーが起きたらデフォでエラーメッセージが表示される方がいいだろ。
0223デフォルトの名無しさんNGNG
>>220
よくなかったらサボらないわけで。
0224デフォルトの名無しさんNGNG
その点、例外はサボれないところが優れているわけだな。
0225デフォルトの名無しさんNGNG
>>222
場合によるね。
0226デフォルトの名無しさんNGNG
printf の戻り値見てなにがうれしいのか良く分からんが。
0227デフォルトの名無しさんNGNG
戻り値のエラー情報見てなにがうれしいのか良く分からんが。

といっているのと同じだよ。>>226
0228デフォルトの名無しさんNGNG
すげー帰納的解釈だなw
0229デフォルトの名無しさんNGNG
>>224
禿同。戻り値厨はデフォの違いの重要性を理解してないんだよなぁ。
フェイルセーフってやつだ。
0230デフォルトの名無しさんNGNG
そもそもprintf()のエラーチェックは errnoだろ。
なにこれw
0231デフォルトの名無しさんNGNG
>>230
戻り値

成功すると,printf は出力バイト数を返します。

エラーの場合は,printf は EOF を返します。
0232デフォルトの名無しさんNGNG
>>231
お、そだね。ゴメン。
0233デフォルトの名無しさんNGNG
>>231
返却値と呼びましょう。
0234デフォルトの名無しさんNGNG
>>233
お前だけだよ。そう読んでいるのは。
0235デフォルトの名無しさんNGNG
errnoにもENOMEMがセットされるかもしれないみたいだ
0236デフォルトの名無しさんNGNG
でもさあ、printfって書式文字列と引渡しパラメータ違ったら
errnoとか関係なく問答無用で落ちない?
0237デフォルトの名無しさんNGNG
>>236
そーだね。つらいよね。
問答無用ってほんとにそのとおりだね。
0238デフォルトの名無しさんNGNG
>>236
gccのチェック機能は便利だよね。何度か助けられた。
0239デフォルトの名無しさんNGNG
なんか例外原理主義っぽくなってますね。
0240デフォルトの名無しさんNGNG
>>222
>エラーが起きたらデフォでエラーメッセージが表示
これは余計なお世話だと思うが。
0241デフォルトの名無しさんNGNG
いや例外が優れているのは事実だし。
メモリが極端に少ないとか実行速度が極端に遅いとか
言語自体が対応していないとか使えない場合じゃないかぎり
使わない理由は無いでしょ。
0242デフォルトの名無しさんNGNG
>>240
はぁ? 逆だろ。
0243デフォルトの名無しさんNGNG
>>242
こわーw
0244デフォルトの名無しさんNGNG
>>240
何もしない状態で、エラーが起きたとき、

エラー処理してない場合処理は続行される。
標準で何も表示されない。
エラー情報自分で表示するように造らなければならない。

のと

エラー処理してない場合も処理は中断される。
標準でちゃんと詳しいエラー情報が表示される。
エラー情報が必要ないときは簡単に消せる

のと

どちらが簡単で安全か一度考えて見れ。
0245デフォルトの名無しさんNGNG
OSのAPIで例外を返してくるものといえばなにかあるの?
0246デフォルトの名無しさんNGNG
返すというのはヘンだな。
0247デフォルトの名無しさんNGNG
>>245
OSのAPIとはWin32のことですか?
あれは似たような機能はあるが例外に対応していない。
C言語から呼び出すことをメインに考えているからね。

WinFXなら全て例外を返す。
0248デフォルトの名無しさんNGNG
>>247
Windows を意識してたのでへんな表現になっちゃったけど、許して。
現状ではそういうことなんだね〜。
0249デフォルトの名無しさんNGNG
>>248
だからWin32はやりにくいんだよ。
今は例外に対応している言語での開発が主流だからね。
わざわざ例外に変換しなくてはならない。
VCLにはWin32CheckといってAPIの戻り値のエラーを
例外に変換する関数が用意されているほど。
早くWinFXに移行しないかな。
0250デフォルトの名無しさんNGNG
WinFX以外で例外投げてくる環境って何?
つーか、WinFXって.NETじゃん。

ランタイムとかクラスライブラリまでOSのAPIって呼ぶのか?
基本サブシステムのシステムコールまでだろう、普通は
0251デフォルトの名無しさんNGNG
普通
0252デフォルトの名無しさんNGNG
絶対突っ込まれると思った
0253デフォルトの名無しさんNGNG
そんなことを書かれたら突っ込みたくもなるよ、普通は。
0254デフォルトの名無しさんNGNG
>>250
APIは手続き型じゃないといけないとか、
中間コードではいけないとかいった
固定観念は捨てたほうが良い。
OSが提供している機能=API
0255デフォルトの名無しさんNGNG
MMUや仮想記憶の仕組みもろくに知らないくせに例外機構ですか。
ここの奴らは所詮一言語の規格の話をしているだけで、根本的なことは何も解っちゃいない。
はっきり言って笑っちゃうね。w
0256デフォルトの名無しさんNGNG
>255
CPUが出す例外とプログラミング言語言語の例外は違うから。
で、ここはカーネルスレじゃないから。
0257デフォルトの名無しさんNGNG
>>0x100
相手にするだけ不毛
0258デフォルトの名無しさんNGNG
OSがOSである最低限の不可分なところまでバラして
残っている機能=APIじゃないの?
0259デフォルトの名無しさんNGNG
>>258
なんだよ? OSがOSである最低限の不可分って?
APIがなんの略か知っているか?
http://yougo.ascii24.com/gh/04/000481.html
アプリケーションプログラムインターフェイスだぞ。

OSである最低限なんて言ったらアプリケーションはいらないわけで、
アプリケーションとのインターフェースも必要ないわけで。
今ある全てのAPIと呼ばれているもの全てがOSである最低限には含まれなくなるぞ。
0260デフォルトの名無しさんNGNG
258は横文字に弱いね。
0261デフォルトの名無しさんNGNG
>>256
ここのアホってぬるぽ例外とかプログラミング言語の例外が投げていると思っているんだ。
あーおどろいた。
その調子でアホな議論を続けてくれたまへ。
0262デフォルトの名無しさんNGNG
プログラミング言語の例外が投げるってなんだ?
例外の多くはライブラリが投げるもんだぞ。
CPUが直接の例外の発生元であることは少ない。
Javaのぬるぽなんかは実装にもよるだろうがCPUのアドレス0にアクセスすることもない。
もしアドレス0にアクセスしてメモリ保護がないCPUだと困るでしょ。
0263デフォルトの名無しさんNGNG
釣られんなアフォ。
0264デフォルトの名無しさんNGNG
>>262
まったく笑わせてくれるねぇ。
おまいの思考はすでにライブラリで終わっている。
そのライブラリが何を行っているか全く考えていない。
さらに言えばOS上でのJVMの仕事すら解っていない。
つまり、すぱーくらすにおんぶにだっこな訳だ。
そりゃ箱庭環境だもんな。
カーネルモード、ユーザーモード、システムコール、特権モード
これらをぐーぐるで検索してから出直してこい。
0265デフォルトの名無しさんNGNG
>>264
調べた結果。やっぱりぬるぽにはCPUの例外は発生してないことが分かりました。
これで満足ですか? それともCPUの例外が発生しているという証拠がありますか?
0266デフォルトの名無しさんNGNG
これだからJavaしか知らないやつは笑ってしまうよ。
すぱーくらすが直接メモリ資源の確保でもしているとでも思っているのだろうか。
Javaまんせー
0267デフォルトの名無しさんNGNG
メモリの確保はOSの仕事だろ・・・。と釣り死にマジレス。
0268デフォルトの名無しさんNGNG
結局ぬるぽの発生元がCPUの例外であるという証拠を突きつけられずにネタ変更かw
なんでこうプログラムの例外の発生元は全てCPUの例外だと
思っちゃう奴がいるんだろうね。そんなもの少ないのに。
0269デフォルトの名無しさんNGNG
>>268の使ってるCPUはpage faultなんて上げないんだよ。8ビットマイコンだから。
0270デフォルトの名無しさんNGNG
まったくこれだからいやなんだよ。じゃう゛ぁ野郎は。
ライブラリがメモリ確保するために何を参照しているか。
OSのシステムコールは何を持って発せられるか。
OSがメモリ確保の失敗をとらえるために何を参照しているか。
OSのメモリ保護機構はCPUのどのような機能を使用しているのか。
OS,アプリはどんなCPUモードで動いているか。
ここまで教えてやって考えられないやつはアホだ。
0271デフォルトの名無しさんNGNG
>>269
そのジョークの意味さえわからないだろうよ。w
0272デフォルトの名無しさんNGNG
>OS,アプリはどんなCPUモードで動いているか。
あらゆる環境を考慮した模範的な解答は存在しない
0273デフォルトの名無しさんNGNG
>261
おう、思ってる。
Java厨だから RuntimeException も基本的にVM辺りが投げなおしてると思ってるよ。
Javaじゃなくても例外ハンドラ取得できるタイプの例外って、大概そうなんじゃないの?
0274デフォルトの名無しさんNGNG
なんか自称上級者がずれたこと言っているようだなw

ファイルオープンエラーの例外を本当にCPUが発生させていると思っているのか?
データベース接続エラーの例外を本当にCPUが発生させていると思っているのか?

ほとんどの例外はCPUの例外処理機構なんか利用してないよ。
0275デフォルトの名無しさんNGNG
CPUが吐く例外って、あってもこれだけだろ。
http://support.microsoft.com/default.aspx?scid=kb;ja;406272

後はpage fault とか通常OSがキャッチするやつくらい?
0276デフォルトの名無しさんNGNG
アドレス0のページフォルトは
2000では発生するがNT4では発生しないぞ。

つーか、Cしか知らない奴は例外といったら
CPU例外しか頭に浮かばないから、話にならない。
0277デフォルトの名無しさんNGNG
あはは、そりゃ俺だ


って、話がずれてきてないか?
0278デフォルトの名無しさんNGNG
0279デフォルトの名無しさんNGNG
エラーチェックとかエラーハンドリングってめんどくさいよな。
いちいち関数の戻り値とかチェックしてるときりがない。
おまえらはどうよ。
0280デフォルトの名無しさんNGNG
0281デフォルトの名無しさんNGNG
確かにエラーチェックはめんどくさい。
でも、エラーチェックを端折るとデバッグが激しくめんどくさい。
0282デフォルトの名無しさんNGNG
>>279
「エラー処理は正常ルートの処理の数倍面倒。」
これに気付いて以来、気が楽になりました。
0283デフォルトの名無しさんNGNG
自分が作る関数のエラー通知方法(戻り値または例外)は
極力統一しておいて、マクロ使って簡単にかけるようにしとく。
DirectShowのサンプルで見たのが最初だったかな。

//func1()を実行してでエラーが起きたらエラーコードCODE1のエラー処理
ERROR_CHECK(func1(),CODE1);
0284デフォルトの名無しさんNGNG
>283
そのサンプル、どこでみれる?
0285283NGNG
>284
昔のDirectX Media SDKに付いてた。
今なら多分、DirectX 9.0 SDKに付いてるんじゃないかな。
MSのサイトからダウンロードできるっしょ
0286デフォルトの名無しさんNGNG
>279
関数の側で入力の型とか値を調べてる。
これは cerr<<"..." して exit(1) を関数にしておいて失敗時に呼ぶ。

何度も呼ぶ関数じゃないか、または本番で起こりうる状況のどちらかなのでアサートにはしてない。
(まあ、何度も呼ぶ関数の分岐も方向決まってればたいしたコストじゃないか)

あと、あまりありがたくない出力制限を行ったときはエラー出力に吐いてる。
この辺、ログファイルとかに吐くための関数自分で作ればよかったかなって思ってる。
0287デフォルトの名無しさんNGNG
例外使えば何も問題ない。
終了。
0288デフォルトの名無しさんNGNG
そんな、超外出のことを堂々と書ける勇気がうらやましいよ。
0289デフォルトの名無しさんNGNG
まったく、羨ましいったらありゃしない。
例外捕捉禁止な環境で開発してるもんで。
0290デフォルトの名無しさんNGNG
C++ってギャグだったのかよorz
それを世間が間に受けたからこんな風になっちまったのか…
0291デフォルトの名無しさんNGNG
今書いてるメソッド、全体で 31 行あるんだけど、
その内 "try {" や "} catch() {" が 11 行…。
イヤン。
0292デフォルトの名無しさんNGNG
catchはともかく、tryが3つ以上あったら市ねと言いたい
0293291NGNG
>>292
漏れも市にたいです。
ゴチャゴチャしすぎ。書き直し決定。

ソケット/ストリーム関連だと、開放時にすら例外起こすからな…とか何とか考え(?)て、
機械的に try, catch を埋め込んでいったら、見事に 4 重ですよ。orz
ServerSocket -> Socket -> Stream -> 内部処理

皆さんは↑こんな場合はどうします?
0294r ◆r/etvCKR2A NGNG
>>293
全部同じレベルのcatchで受け取ったら?どうせもう何をする事も出来まい

try {

socket = serversock.accept()
InputStream is = socket.getInputStream();
whiel( is.ready() ) {
//:
}

}catch( IOException ) {
// :
}

つか、そのコードみせれ。
http://pc5.2ch.net/test/read.cgi/tech/1081863662/l50
ここに貼る。
0295デフォルトの名無しさんNGNG
一ヶ月前の記事ですよ
0296291 のコード (1/3)NGNG
>>294
ではまぁ、晒しageます。
といっても、当時のコード消しちゃったので、記憶を辿りつつ…ですが。

public void tryTryTryWithSocket() {
    try { // for ServerSocket
        ServerSocket serverSocket = new ServerSocket(port);
        while (valid()) {
            Socket socket = null;
            try { // for Socket
                Something somethingToBeDone = null;
                ObjectInputStream in = null;
                socket = serverSocket.accept();
/*
0297291 のコード (2/3)NGNG
>>296
容量の関係上、タブを2に変えます。
*/
        // input part
        try { // for InputStream
          in = new ObjectInputStream(socket.getInputStream());
          try {
            somethingToBeDone = (Something)in.readObject();
          }
          catch (ClassNotFoundException e) {
            // for InputStream
          }
          finally {
            if (in != null)
              in.close();
          }
        } 
        catch (IOException e) {
          // for InputStream
        }
/*
0298291 のコード (3/3)NGNG
>>297
*/
        // process part
        Something result = doWithSomething(somethingToBeDone);

        // output part
        ObjectOutputStream out = null;
        try {
          out = new ObjectOutputStream(socket.getOutputStream());
          out.writeObject(result);
          out.flush();
        }
        catch (IOException e) {
          // for OutputStream
        }
        finally {
          if (out != null)
            out.close();
        }
      }
      catch (IOException e) {
        // for Socket
      }
      finally {
        if (socket != null)
          socket.close();
      }
    }
    serverSocket.close();
  }
/*
0299291 のコード (4/3 orz)NGNG
>>298
*/
  catch (IOException e) {
    // for ServerSocket
  }
}
/*
こいつはテストコードだったこともあって、
結局は >>294 さんみたいな形になりました。
でも、どう改良できるか興味があります。
*/
0300291NGNG
以上です。
つらつらとみっともないコードです。お目汚しスマソ。
0301r ◆r/etvCKR2A NGNG
public void tryTryTryWithSocket() {
  ServerSocket serverSocket = new ServerSocket(port);
  try {
    while( valid() )
     acceptAndProcessByServerSocket( serverSocket );
  } catch( IOException e ) {
    // for ServerSocket
  } finally {
    serverSocket.close();
  }
}
private void acceptAndProcessByServerSocket( ServerSocket serverSocket ) {
  Socket socket = null;
  try { // for Socket
    socket = serverSocket.accept();
    outputToSocket( socket, doWithSomething( inputFromSocket( socket ) ) );
  } catch( IOException e ) {
    // for Socket
  } finally {
    if( socket != null )
     socket.close();
  }
}
0302r ◆r/etvCKR2A NGNG
private Something inputFromSocket( socket ) {
  ObjecetInputStream in = null;
  try {
    in = new ObjectInputStream( socket.getInputStream() );
    return (Something)in.readObject();
  } catch( IOException e ) {
    // for InputStream
  } catch( ClassNotFoundException e ) {
    // for InputStream
  } finally {
    if( in != null )
     in.close();
  }
}
private void outputToSocket( Socket socket, Something something ) {
  ObjectOutputStream out = null;
  try {
    out = new ObjectOutputStream(socket.getOutputStream());
    out.writeObject(result);
    out.flush();
  } catch( IOException e ) {
    // for OutputStream
  } finally {
    if( out != null )
     out.close();
  }
}
0303r ◆r/etvCKR2A NGNG
>>291
正直、IOExceptionだかなんだかが起きた後、
それ以降の処理が正常に行えるのか、たとえば、
InputStreamを開くのに失敗した後、
そこから取得するはずだったオブジェクトを
OutputStreamに書き出す処理に意味があるのかどうかは疑問だったが、
とりあえずオリジナルの動作に合わせててみた。

本質的にはtry-catchのネストの深さは変わっていないが、
とりあえず見た目のtry-catchだけ減らした。
0304デフォルトの名無しさんNGNG
>>301-303
おー、綺麗になってますね。
オリジナルの見た目の悪さと
変更のしにくさが解消されていると思いました。

> InputStreamを開くのに失敗した後、
> そこから取得するはずだったオブジェクトを
> OutputStreamに書き出す処理に意味があるのかどうかは疑問だったが、

ですね。
かなりやっつけで作っていましたから。恥しい…。

> 本質的にはtry-catchのネストの深さは変わっていないが、
> とりあえず見た目のtry-catchだけ減らした。

ここらへんは減らしにくいのでしょうね。
GJ です。
0305デフォルトの名無しさんNGNG
Java では例外使うのでいいと思うけど、
C/C++ では例外ではなくてエラーコードを返すほうが正しいと思う。
理由は、
(1) エラーコードにせよ例外にせよ、きちんとしたプログラムを書くときは
すべての可能性に対して対処するコードを書かないといけない。
例外だからエラー処理を省略できるわけでもない。
(2) 1つの関数内で発生する可能性のあるエラーは、
その関数内でエラー処理を行うべきであって、
むやみに呼び出し元の catch をあてにすべきではない。
そうしないと関数定義の実装隠蔽の原則がくずれる。
(3) 例外はパフォーマンス上の欠点をもっている。
(4) 例外が使えないコンパイラやプラットフォームもあるので、
移植性を考えると使わないほうがよい。

例外はエラーコードの進化形じゃなくって、
setjmp/longjmp の進化形だと思うんだが。
0306デフォルトの名無しさんNGNG
>>305
例外の利点をまったくわかってない奴のセリフだな。
0307デフォルトの名無しさんNGNG
>>306 すいません、具体的な反論をお願いします。
0308デフォルトの名無しさんNGNG
>>305
> (1) エラーコードにせよ例外にせよ、きちんとしたプログラムを書くときは
> すべての可能性に対して対処するコードを書かないといけない。
ミスで対処するコードを書かなかった場合でも止まる。
つまりフォールセーフな設計なのが例外の利点なのだが。

> (2) 1つの関数内で発生する可能性のあるエラーは、
> その関数内でエラー処理を行うべきであって、
> むやみに呼び出し元の catch をあてにすべきではない。
その関数内でエラー処理が行えるのならエラーコードすら返す必要ないだろ。
エラーをコンソールに表示するかメッセージボックスに表示するかなんてのは
汎用的な関数になるほど関数内でわからないんだよ。

(3) 例外はパフォーマンス上の欠点をもっている。
C使ってください。

(4) 例外が使えないコンパイラやプラットフォームもあるので、
Cと標準ライブラリだけ使ってください。
0309デフォルトの名無しさんNGNG
パフォーマンス上の欠点って欠点しかない物ならともかく
利点があるのなら「パフォーマンス上のトレードオフがある」と言うべき。
そんなもん当たり前のことなので欠点とかいちいち言うことじゃない。
0310デフォルトの名無しさんNGNG
> (4) 例外が使えないコンパイラやプラットフォームもあるので、
日本語が使えないコンパイラや(ry

printfやmallocが使えないプラットフォームなんてのもあるので(ry
0311デフォルトの名無しさんNGNG
その手の本は読んだことがないのですが…

>>305
(1), (2)
伝搬すべきエラー(例外)もあるでしょうから、
全ての可能性について網羅してしまうことはないかと。
網羅してしまうと、呼び出し元へのエラーは戻り値を通してしか
通知することができなくなってしまうでしょう。
戻り値ありきな考え方の様に思えます。

(3), (4)
環境によりけり、ですね。
そういえば、C/C++ で例外使ったこと無いな。

> 例外はエラーコードの進化形じゃなくって、
> setjmp/longjmp の進化形だと思うんだが。

機能的にはそうなんでしょうね。
個人的には単純に、例外 = エラーコード + setjmp/longjmp
だと思ってます。
0312デフォルトの名無しさんNGNG
>>308
>> (1) エラーコードにせよ例外にせよ、きちんとしたプログラムを書くときは
>> すべての可能性に対して対処するコードを書かないといけない。
>ミスで対処するコードを書かなかった場合でも止まる。
>つまりフォールセーフな設計なのが例外の利点なのだが。

ミスでエラー処理を書かなかった場合で、
それで例外がスローされて親で ctach されたとしてもフェイルセーフとは言えない。
その後の正常動作が少しも保証されないからね。

>> (2) 1つの関数内で発生する可能性のあるエラーは、
>> その関数内でエラー処理を行うべきであって、
>> むやみに呼び出し元の catch をあてにすべきではない。
>その関数内でエラー処理が行えるのならエラーコードすら返す必要ないだろ。
>エラーをコンソールに表示するかメッセージボックスに表示するかなんてのは
>汎用的な関数になるほど関数内でわからないんだよ。

ここでいう「エラー処理」というのは、
エラーが発生する可能性があることをプログラマが認識して、
エラーコードの変換や、その関数で使用しているリソースを解放した上で、
明示的に呼び出し側にエラーコードを返す、
という意味です。

>> (3) 例外はパフォーマンス上の欠点をもっている。

これはトレードオフということで了解です。

>>(4) 例外が使えないコンパイラやプラットフォームもあるので、

>Cと標準ライブラリだけ使ってください。
C++ の例外以外の機能を捨てるつもりはありません。
0313デフォルトの名無しさんNGNG
>>311

(1), (2)
> 伝搬すべきエラー(例外)もあるでしょうから、
> 全ての可能性について網羅してしまうことはないかと。

それはそうですが、コーディング規約の一貫として、
すべてのエラーコードの判定をコーディングするのがよいかと思います。
プログラマがすべてのエラーを認識している証となりますから。

↓こんなコードでも書くべき。
if (err == ERR_NO_MEMORY) {
 return err;
}

> 網羅してしまうと、呼び出し元へのエラーは戻り値を通してしか
> 通知することができなくなってしまうでしょう。
> 戻り値ありきな考え方の様に思えます。

すいません、これで何が問題なのかよくわからないのですが。。
もう少しご説明願えますか?
0314デフォルトの名無しさんNGNG
>>313
ああ、関数内でエラーに対処するコード(それこそメッセージ表示
とか)を書けというわけではなく、捕捉して再送しろ、ということ
でしたか。(from >>312 の (2) と >>313 の後半)

確かに、呼び出された方は自分がどんなエラーコード
(例外)を投げるのかをきちんと把握しておくべきですね。

> すいません、これで何が問題なのかよくわからないのですが。。
> もう少しご説明願えますか?

や、すみません。忘れてください。orz
お酒飲みながら書いてたので、今自分でもその考えを再構築できな
い…。
0315デフォルトの名無しさんNGNG
>>312
> ミスでエラー処理を書かなかった場合で、
> それで例外がスローされて親で ctach されたとしてもフェイルセーフとは言えない。
> その後の正常動作が少しも保証されないからね。
はぁ。例を出さなきゃわかりませんか。

ファイル移動する関数を作るとする。
処理の内容は以下のとおり。
1.ファイルコピー関数の呼び出し。
2.ファイル削除関数の呼び出し。

もしこの関数がミスでエラー処理をしていなかった場合、
エラーコードチェック型だと
1のファイルコピー関数の呼び出しが容量不足で失敗しても
2のファイル削除関数が呼び出されます。

しかし例外だとエラー処理をしていなくても2のファイル削除関数が
実行されることはありません。これがフェイルセーフということです。

フェイルセーフとは正常動作を保証することじゃありません。
失敗(フェール)しても安全(セーフ)であるということです。
用語自体もまったくわかっていませんね。
0316デフォルトの名無しさんNGNG
>>313
> それはそうですが、コーディング規約の一貫として、
> すべてのエラーコードの判定をコーディングするのがよいかと思います。
現実的に無理です。こんなことが可能ならミスなんてありえません。
0317デフォルトの名無しさんNGNG
二つの整数A、Bを引数にAをBで割った時の答えを返す関数に
Bを0にして呼び出したとき(ゼロ除算)のエラーコードを考えれば
エラーコードを返す方式の欠点が良くわかる。
徹底するともう戻り値はエラーコードを返すことにしか使えなくなってしまう。

関数Xで関数Yを呼び出し、関数Yで関数Zを呼び出す。
最初はエラーが発生する仕様ではなかったが、
あとから関数Zがエラーを発生することができてしまった。
そうすると関数Xも関数Yも全部修正が入る。これもエラーコードの欠点。

さらに関数X、Y、Zがともに引数を返す仕様であればもっと最悪。

さらに関数Yが最初っからエラーコードを返す仕様の関数で、あとから関数Zが
エラーを返すに仕様になった場合、関数Yがどうやって関数Zのエラーコードを
返すかを考えるともう泥沼。
0318デフォルトの名無しさんNGNG
その場でログはいてexitで無問題
0319デフォルトの名無しさんNGNG
>>315 >>316
返答するのも疲れる内容だから、他の人に反論してもらいたい。
age
0320デフォルトの名無しさんNGNG
>>318
それが許されるならエラーコードすら返す必要ないじゃんw
0321デフォルトの名無しさんNGNG
>>319
だから君は例外の利点をまったくわかってないと言われるんです。
常識的な内容だからこれぐらい知っておきなさい。
0322デフォルトの名無しさんNGNG
例外安全にするのは結構面倒だよね
0323デフォルトの名無しさんNGNG
>>317
> 徹底するともう戻り値はエラーコードを返すことにしか使えなくなってしまう。

それはそれできれいな設計では?
0324デフォルトの名無しさんNGNG
>>317
> Bを0にして呼び出したとき(ゼロ除算)のエラーコードを考えれば
数値計算系の関数は、入力の数値が規定外であれば、
その挙動は不定ということで十分。
0325デフォルトの名無しさんNGNG
>>317
> エラーを返すに仕様になった場合、関数Yがどうやって関数Zのエラーコードを
> 返すかを考えるともう泥沼。

何もエラーコードを直接の戻り値にしなくてもいい。
Windows API のように GetLastError() を用意してもいいよ。
0326デフォルトの名無しさんNGNG
極論だなぁ
そんなのは場合によりけりだっつうの
厳密にチェックすべきシチュエーションだってあるだろ
0327デフォルトの名無しさんNGNG
>>326 何に対するレス?
0328デフォルトの名無しさんNGNG
>>327
>>324
だす
0329デフォルトの名無しさんNGNG
>>328
そうかなぁ。
数値計算って一般に高速性を要するでしょう?
いずれにしても例外を使ってオーバーヘッドを増やすほうがよくないと思うけどなぁ。
あんまり極論だとは思わないよ。
0330デフォルトの名無しさんNGNG
例外で遅いのはtryブロックへの進入と退出(例外ハンドラの登録と削除)なので、
演算関数が例外を投げる事はパフォーマンスに影響を与えないだろうよ。
除算関数のdenominatorに0が与えられるなんてのはlogic_errorの領分であって
そんな事が頻繁に起こりうる(0が定常的に与えつづけられる)なら直前に条件分岐で弾くべきでないの?
0331デフォルトの名無しさんNGNG
>>330 つまり例外はいらないと?
0332デフォルトの名無しさんNGNG
>>331
アフォですか?
0333デフォルトの名無しさんNGNG
> 直前に条件分岐で弾くべきでないの?

ということであれば、規定外の入力に対しては動作不定であってもよいわけで、
例外はいらないでしょう?
0334デフォルトの名無しさんNGNG
>>333
見苦しいよ
0335デフォルトの名無しさんNGNG
>>334
すいません、まじめに話しをしているんですけど。
もしかして私が何か勘違いしているのかな。
0336デフォルトの名無しさんNGNG
>>333
弾き忘れたときにどうなるかが問題。
イレギュラーな解を元に処理を続行してしまうか、unexceptedでterminateされてしまうか。
潜在したバグほど厄介なものは無いだろう
0337デフォルトの名無しさんNGNG
>>336
もちろん、関数の実装側では除算の前にゼロチェックするぐらいの
堅牢さは必要だと思っていますよ。
問題は除算が必要なときに万が一ゼロであった場合にどうするかです。

その場合、
[A] 動作不定として処理する
[B] エラーコードを返す
[C] 例外を投げる

という3種類のうちのいずれを選択するか、というのが議題ですが、
[C] の優位性って特にありますか?

[A] はつまり、「呼び出し側で入力値の検査をしないさい」
という仕様であり、必ずしもエラーチェックを行わないわけではありません。
単にエラーチェックを呼び出し側が行うか、関数側が行うかの問題です。

[B] は関数側がやってくれます。

[C] も関数側がすべて明示的にやるのが望ましいですが、
>>336 さんのご意見では、関数の実装が完璧でなくても、
例外が投げられる (ことがある) ので、落ちることはないと言いたいわけですよね。

しかし、単に「落ちない」というのを利点にするのであれば
[A] も同じ性質を備えているわけですよ。
0338デフォルトの名無しさんNGNG
落ちないではなく、落ちることが利点なんだけど
0339デフォルトの名無しさんNGNG
>>338
え?そういう発想なんですか?
ちょっと考えてみます。
0340デフォルトの名無しさんNGNG
>>338
「捕捉されない例外が伝搬するのが良い」と言っている?
0341デフォルトの名無しさんNGNG
>>318
>その場でログはいてexitで無問題

これが例外の便利さを端的に語っていると思うのだが。catchしなかったらデフォルトこの動作でしょ
0342デフォルトの名無しさんNGNG
>>338
そう、それをわかってない奴が多いよな
0343デフォルトの名無しさんNGNG
気を付けるレベル(レイヤ)

利用側
 事前引数チェック
 エラーコードチェック
 例外
関数側

個人的には0除算ぐらいで例外投げるのはやりすぎな気がする
正常でない動作に気を使うのは誰だ?上か?下か?みたいな感じで使い分ければいいんでないのかなぁ

せっかく例外で上手いこと書けるケースがあるんだし、そういう場面では使えばいい
だからといって何でもかんでも例外で済ませようとすると小回りが…
そんな気持ち

# あと勝手にエラー出力するような関数は、そのライブラリのポリシー次第だと思た
0344デフォルトの名無しさんNGNG
>>343
>個人的には0除算ぐらいで例外投げるのはやりすぎな気がする

アホか
第2引数に0を受け取った関数 int divide(int, int) はどう振舞ったらいいんだ?
0345デフォルトの名無しさんNGNG
>>344
除算をわざわざ関数にした程度なら、0を返しておけばいいんでない?
利用目的次第だとは思うけど
0346デフォルトの名無しさんNGNG
>除算をわざわざ関数にした程度なら

本気でわかってないんだな。
わかりやすいように除算演算子を関数に書き換えて見せたのに。

"result = 4 / 0" やら "result = divide(4, 0)"やらが
黙って0を返すのを見てなんとも思わない?
0347デフォルトの名無しさんNGNG
>>346
それって結局その関数がどのように利用されるか次第なのではないの?
私は勝手に解釈して、そのような機能と決め打ってしまったけど
本当に例外を投げて欲しいケースで利用するならそのように作ればよろしいのでは?
0348デフォルトの名無しさんNGNG
>>347
まだわからないかな〜。除算演算子は0割されたときに何を返せばいいの?
0349デフォルトの名無しさんNGNG
>>291
public void tryTryTryWithSocket() throws IOException {
try {
Socket socket = serverSocket.accept();
try {
ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
try {
Something somethingToBeDone = (Something)in.readObject();
Something result = doWithSomething(somethingToBeDone);

ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
try {
out.writeObject(result);
} finally {
out.close();
}
} finally {
in.close();
}
} finally {
socket.close();
}
} finally {
serverSocket.close();
}
}
4重ぐらいで怯むな。でもメソッド分けた方が良いな。
0350デフォルトの名無しさんNGNG
>>348
0除算したら例外をcatchするからそれを使え?
そりゃそうだわな
0351デフォルトの名無しさんNGNG
>>347
344では用途が限定されていないんだから、問題の関数のプロトタイプは
完全なものに仕様とすると、(たとえば)以下のようになる。

pair<bool, int> divide(int num, int div);
bool divide(int num, int div, int& result);

どうみても使いづらい関数だよな?
0352デフォルトの名無しさんNGNG
>>342
このスレ的には、正しいエラー処理が強制される例外はあまりよろしくない存在だろう。
0353デフォルトの名無しさんNGNG
業務系アホグラマは、言語の話をするなよな
0354デフォルトの名無しさんNGNG
業務系だからこそ簡潔で堅牢な言語がほしい
学者はアセンブラでもやってろ
0355マイク ◆yrBrqfF1Ew NGNG
入力のエラーチェックとかしてねえとbugtraqとか活発になりそうだな。
0356デフォルトの名無しさんNGNG
エラーチェックが趣味です。
try-catchで、メソッドごとに、あらゆる例外に対して処理を行います。
おかげで短いはずの1メソッドが100行軽く超えます。
0357デフォルトの名無しさんNGNG
エラーチェックが趣味です。
ifで、メソッドごとに、あらゆるエラーコードに対して処理を行います。
おかげで短いはずの1メソッドが100行軽く超えます。


で、何が言いたいの? >>356
0358デフォルトの名無しさんNGNG
例外だとcatchでまとめることができるから一行ごとに
エラーチェックしても行が伸びなくて済むな。
エラーを上位関数にそのまま返すのなら一行も増やす必要が無い。

それにたいしてエラーコードだと一行ごとにエラーチェックする場合、
チェック関数呼び出すために少なくとも一行は増やす必要がある。
foo(bar()) という書き方もできなくなるなしな。
0359デフォルトの名無しさんNGNG
>エラーを上位関数にそのまま返すのなら一行も増やす必要が無い。
そうやって最上位まで返すとabortします
0360デフォルトの名無しさんNGNG
>>359
エラーコードの場合でも同じだけど?
しかもエラーメッセージすら表示されずに終了するね。
0361デフォルトの名無しさんNGNG
>>359
そりゃエラーが出ているのに途中でエラー処理をしなかったら落ちて当然でしょう。
それともエラーが出ているのに進んでほしいの?
エラーコードの場合エラー処理をしなかったらエラーが出ても進みますね。最悪ですね。
0362デフォルトの名無しさんNGNG
核ミサイル発射停止システムが例外の拾い忘れでabortしちゃったらどうしよう
0363デフォルトの名無しさんNGNG
void 核ミサイル発射準備() {
 if (! this.has発射許可()) {
  throw new 発射許可がねーよException();
 }
 粛々と準備を進める();
}

int 核ミサイル発射準備() {
 if (! this.has発射許可()) {
  return 発射許可がねーよERROR_CODE;
 }
 粛々と準備を進める();
 return 0;
}

us.核ミサイル発射準備();
us.発射();
0364デフォルトの名無しさんNGNG
>>362
核ミサイル発射システムがエラーコードチェック拾い忘れで
そのまま発射したらどうしようw
0365デフォルトの名無しさんNGNG
>>362
そんなもんはデバッグの段階でつぶしとくんだよ。
落ちてくれれば発見できたエラーも、握りつぶされて
一見正常に動いているように振舞ってしまうと発見が遅れる(または発見されない)
0366デフォルトの名無しさんNGNG
>>364
その後核ミサイル発射停止システムを動かせばいい
エラーチェックがエラーコードなら核ミサイル発射停止システムは
いきなり止まったりしないしな。
0367デフォルトの名無しさんNGNG
>>366
停止システムと発射システムが同一のインスタンスに共存するのか。かなり怖いな。
0368デフォルトの名無しさんNGNG
たしかに止まらないが、それは正常に動いているのではなく
たんに異常状態で動作(暴走)しているだけ。暴走しているかどうか
わかるまでには時間がかかるため、これは止まるよりもさらに太刀が悪い。

核ミサイル発射停止システム実行。
  ・
  ・
  ・
数分後
「おい? まだ動いているんじゃないのか?」
「でも停止しましたって表示されているぞ。」
「本当に止まっているのか?」
「表示は停止しましたとでていますが肝心のシステムが正常に作動していません。」
「なんでエラー表示されなかったんだ?」
「予備の核ミサイル発射停止システムを実行しろ!」
「間に合いません!」
0369デフォルトの名無しさんNGNG
おまいら今日は面白くないですよ
0370デフォルトの名無しさんNGNG
int main()
{
stop();
print("停止しました。");
return 0;
}

stop()のエラーチェックをし忘れるとエラーコードだと>>368のようになります。
例外のほうがより安全ですね。
0371デフォルトの名無しさんNGNG
なるほど!明日からC言語はやめてJAVAで書くことにします!
0372デフォルトの名無しさんNGNG
やっぱりBASICが一番だな。
暴走してもSTOPキーで止められるから。
0373デフォルトの名無しさんNGNG
頭の反応が遅い372がSTOPを押す頃には核ミサイルはもう発射されてるわけだが
0374デフォルトの名無しさんNGNG
みんな fclose の戻り値チェックしてるかい?
0375デフォルトの名無しさんNGNG
書き込みの場合は。
03761NGNG
まだこのスレあったのか
0377デフォルトの名無しさんNGNG
>>374 fflush でやる。
0378デフォルトの名無しさんNGNG
例外はすべてint型とする。エラー定数ヘッダerrcode.hに定義された定数を送出すること。
というプロジェクトに配属されたんですが、こんな例外の使い方ってアリなんでしょうか?
0379デフォルトの名無しさんNGNG
>>378
COM?
0380デフォルトの名無しさんNGNG
>>378
さら仕上げ
0381デフォルトの名無しさんNGNG
>>124に笑った
スルーされまくってるし
0382デフォルトの名無しさんNGNG
いまさらレスしている381にワラタ
0383デフォルトの名無しさんNGNG
int __c_throw_code;
jmp_buf* __c_errjmp;
c_throw(code) {
__c_throw_code = code;
longjmp(__c_errjmp,1);
}

#define c_try_begin \
{ jmp_buf* __c_errjmp_save = __c_errjmp, \
__c_errjmp_tmp = alloca(sizeof(jmp_buf)); \
__c_errjmp = __c_errjmp_tmp; \
if (!setjmp(__c_errjmp)) {

#define c_try_end \
__c_errjmp = __c_errjmp_save;

#define c_catch_begin \
} else { \
__c_errjmp = __c_errjmp_save;
#define c_catch_end \
} \
}
0384デフォルトの名無しさんNGNG
test1(x) { if (x == 1) c_throw(1);}
test2(x) { if (x == 2) c_throw(2);}
test3(x) { if (x == 3) c_throw(3);}
test4(x) {
if (x == 4) c_throw(4);
c_try_begin
test1(x-1), test2(x-1), test3(x-1);
c_try_end
return 1; // true
c_catch_begin
printf("catch '%s' err :%d\n", __FUNCTION__, __c_throw_code);
c_throw(__c_throw_code);
return 2; // catch true
c_catch_end
return 3; // true
}

test(x) {
c_try_begin
test1(x), test2(x), test3(x);
printf("true => %d\n",test4(x));
c_try_end
c_catch_begin
printf("catch '%s' err :%d\n", __FUNCTION__, __c_throw_code);
c_catch_end
}

こういうことしてる人いますか?
実際使う場合はWindowsの__tryとかも考慮しなきゃいけないけど。
いまいちですよね・・・。
0385デフォルトの名無しさんNGNG
でもCで書く場合は結構使えるんだよね。
実際tryハンドラ書くとこはそんなにないから、そこは我慢して書く。
Cでこういうことする場合はヒープの扱いが面倒だけど。
0386デフォルトの名無しさんNGNG
いろんなものがリークしまくり
0387r ◆r/etvCKR2A NGNG
>>386
核ミサイルが漏れるよりはマシさ
0388デフォルトの名無しさんNGNG
スーツケース爆弾の方が……。
ミサイルはきちんと運用できなきゃ飛ばないので安心といえば安心。
0389デフォルトの名無しさんNGNG
>>385
自分はそういうことCでやる場合はヒープマネージャを作って
適当なハンドラのブロックで一気に開放させてる
0390デフォルトの名無しさんNGNG
>>1
                               /  気  !
                           l      |
''''''''''‐-、,                        |   に  |
::::::::::::::::::::\                     |        |
:::::::::::::::::::::::::ヽ               _,,,,,,_ .|   す  |
:::::::::::::::::::::::::::::':,               ,.-''"::::::::::::`l        |
::::::::::::::::::::;ヘ::::;::i            /::::::::::::::::::::::::|   る   l
::::::::::::::::::::'、|ヽ!ヾ           /::::::::A:::;::::/!::ムli       |
:::::::::::::::::::、:'、              ,':::::::::ハ;ハ;l レ' '|ヽ  な  /
:::::::::::::::;:::| `!  ,.,.._         レi::;lV. ┃   ┃''"ム  /
::::::/l:::ハ:|,/  i ヽヘ,       '〈|         ソ'''''、
:::/ ,|/,,/    ',  l, ヽ.       l、   r一‐:、  /:::::::::::'、
/ | ''      \ 丶.ll''r、.,_   /::`':.、 ヽ--‐',.イ、::::::::::::::'、
:‐┴:、.       `i''y'l |: : : ``''ヽ‐''ヾil´`i';、''" /  >、:i、::::::',
    \       '-'、/ : : : : : : :`: : : lL,, l  /_ ,//: :\'、;::、
0391デフォルトの名無しさんNGNG
>>344
鼻から悪魔が出る
■ このスレッドは過去ログ倉庫に格納されています