例外処理exception, runtime_errorの使い方
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNG先ず1問目。
std::runtime_errorでエラー文字列を上に渡すことが出来ます。
しかし、多国語対応だとクラスの中に膨大な文字を持つようになります。
かといって、エラー文字列取得クラスなんて用意する、汎用的なクラスになりません。
やっぱ、runtime_errorは捨てて、素直にexceptionを派生するべき?
0002デフォルトの名無しさん
NGNG0003デフォルトの名無しさん
NGNG0004デフォルトの名無しさん
NGNG0005デフォルトの名無しさん
NGNG0006デフォルトの名無しさん
NGNGC++相談室 part18
http://pc2.2ch.net/test/read.cgi/tech/1050177746/
0007デフォルトの名無しさん
NGNG0008デフォルトの名無しさん
NGNGたとえば、シーンチェンジに使ってたりします。
0009デフォルトの名無しさん
NGNGそういう使い方はやめろ。
0010デフォルトの名無しさん
NGNGなんで?結構便利だなって思ってたんだけど。
私はプログラムの経験が少ないんで問題に気づいてないのかもしれないですね。
できればシーン変更の標準的な方法を教えてほしい。
0011デフォルトの名無しさん
NGNGなんだけ?RPG?
0012デフォルトの名無しさん
NGNGgotoよりはいいでしょ。
0013デフォルトの名無しさん
NGNG0014動画直リン
NGNG0015デフォルトの名無しさん
NGNG一気に親メソッドに戻りたいときはいいね。
0016デフォルトの名無しさん
NGNGおいおい
0017NullPointerExceptionはぬるぽ
NGNG本チャンコードが5行程度で
例外処理が30行以上のコード見たことがある。
「なんでや?」と聞くと
「あ、それ0で助産したときの処理です」とこきやがった。
確かにそのとおりだったが
・・・
0018デフォルトの名無しさん
NGNG構造化例外にすると1行になるコードかい?
0019デフォルトの名無しさん
NGNG例外処理のコードが少なすぎるって言いたいのかな?
0020デフォルトの名無しさん
NGNG多言語対応したくて、組み込みからWindowsをカバーしたい場合。
0021デフォルトの名無しさん
NGNG0022デフォルトの名無しさん
NGNG0023デフォルトの名無しさん
NGNG例外処理で30行?いいんでないの?
サーブレットの話しだけど例外発生したらエラー画面に飛ばすとかの処理
書いたらそれくらいならない?
画面に飛ばす処理を共通化するならn行で済むけど。
0024デフォルトの名無しさん
NGNG0025デフォルトの名無しさん
NGNGthrow Exception("")
したら、メッセージボックス出力されてました。
が、MFCのプログラムだと異常終了します。
MFCな人達はどうしてますか?
002625
NGNGやっぱ、トラップを自分で書くしか無いかな。
BCBのプロジェクトファイルみたいなのはどこにあるんだろう。
0027デフォルトの名無しさん
NGNGExceptionクラスを継承してコンストラクタでsuper(String message)を呼び出しているだけで
終わってしまっていますが・・・
0029デフォルトの名無しさん
NGNG0030デフォルトの名無しさん
NGNGCWinApp派生クラスのInitInstance, ExitInstanceと、
メインウィンドウのWindowProcでtry-catchしてSEH以外は全部捕まえてる。
特別なエラー処理をしたいハンドラはそのハンドラで独自にtry-catch。
>29
MFCのAfxThrowMemoryExceptionは
グローバル変数へのポインタを飛ばしてるだけだから
メモリを確保しない…んじゃなかったかな。
std::exception派生クラスでそういう仕組みは作れる?
0031デフォルトの名無しさん
NGNGってなあに?
0032デフォルトの名無しさん
NGNG0033デフォルトの名無しさん
NGNG技があったな。
Vectorに溜め込む専用の例外クラスまで用意していたが、
汎用性がどれだけ高くなるか疑問。
0034デフォルトの名無しさん
NGNG役に立つの?
役に立つなら、C++版を作成しようかな、と。
0035デフォルトの名無しさん
NGNGWindowProcでキャッチするのは確かに気持ちいいんだが、
例外をOSのDLLのスタックを通過させないように注意しろよ。動作が不定になるぞ。
サブクラス化した場合とかは特に、そっちのWindowProcでもちゃんと全catchするように。
003630
NGNG何か大変だね。やめとこう。
BCBなら普通に出来ることなのにね。
TApplication::OnExceptionていうイベントハンドラさえあるのに。
0037bloom
NGNG0038デフォルトの名無しさん
NGNG別に大変ではないからやりなさい。
003930
NGNGえーと、MFCの場合は
CSomeException g_GlobalException ; //CException派生、グローバル変数
throw &g_GlobalException ;
とポインタを投げるので例外処理時にメモリを新たに確保しない。
(スタックは使うのかな。分かんない)
STLだと
MyException g_E ; //std::exception派生、グローバル変数
throw g_E ;
と投げて受け側が
catch(std::exception& e)
と受けてもどこかで例外オブジェクトがコピーされちゃうんじゃない、か、
と思っちゃったんだけど…
コピーされないか。されませんね。すみませんでした…
004030
NGNGげ!?
OSのDLLのスタックを通過って、
DispatchMessage API の外側でtry-catchしちゃまずいとかそういうこと?
全然意識してなかったよ…。
#ところでこのスレって環境依存の話ばっかりしちゃまずい?
004130
NGNGって、キミは誰だ?オレか?
MFCにもCWinApp::ProcessWndProcException
というのがあるけどCException派生の例外しか処理してくれないのでね。
0042デフォルトの名無しさん
NGNG0043デフォルトの名無しさん
NGNG0044デフォルトの名無しさん
NGNGVC++なんかの、DLLの例外をアプリがcatchすること自体キショイような気がする。
0045デフォルトの名無しさん
NGNGうわっ、例外のコピーコンストラクタが例外を投げたら、terminate()
呼ばれるんだ。コンストラクタが例外投げたときと同じように、
新しい例外の方が有効になるんだとばっかり思ってた。
でも、よく考えると、例外オブジェクトの領域は普通は一箇所だから、
新しく例外を投げようとするとオブジェクトを上書きしてしまうのか。
0046動画直リン
NGNG0047デフォルトの名無しさん
NGNGstd::runtime_errorを派生したいんですが、
なんかコンパイルエラーの嵐です。サンプルきぼんぬ。
0048動画直リン
NGNG0049デフォルトの名無しさん
NGNG0050デフォルトの名無しさん
NGNG「コンストラクタで例外を投げるのはオススメできない」
って書いてあったんですけどコレはなんででしょう?
特に理由も書いてなかったし
今までバリバリ例外投げてたんですけど、これってマズイ?
0051デフォルトの名無しさん
NGNG0052デフォルトの名無しさん
NGNGMSDNの"Deep C++"にあれこれ書いてある。
ttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpdndeepc/htm/deep01202000.asp
どうせアプリケーションを終了させなきゃならないような例外だったら投げても
いいかと思うけど。
0053デフォルトの名無しさん
NGNG第14部だけ張るとは、恐ろしい罠だな。
気をつけろよ。>>50
0054デフォルトの名無しさん
NGNG005552
NGNGおお、言われてみれば。13部〜16部くらいがこのあたりの話。
でも全編読むべきなのだろうな。
…なんか難しくてよく分からんのだが。
0056デフォルトの名無しさん
NGNG0057デフォルトの名無しさん
NGNG問題は、14部から後に筆者の意見が逆転してることだな。
0058デフォルトの名無しさん
NGNGWindowsアプリでint系の割りこみハンドラって作れるの?
0059デフォルトの名無しさん
NGNG0060デフォルトの名無しさん
NGNG奇数アドレスを参照しようとしたら例外(int)飛ばす事にしたいんだけど、
できるんでしょうか。
0061デフォルトの名無しさん
NGNGペナルティで実行クロック余計にかかるだけでは・・・最近の知らんが。
モトロラとかあっちならあったな。
0062デフォルトの名無しさん
NGNG0063デフォルトの名無しさん
NGNG心当たりの在る方はいらっしゃいませんか。
RTTI有効にしてるのがイカンのだろうか・・・
0064デフォルトの名無しさん
NGNG0065デフォルトの名無しさん
NGNG0066デフォルトの名無しさん
NGNGif使って書くよりよほど見やすいと思うけど・・・
0067デフォルトの名無しさん
NGNG終端(EOF)は例外。
0068デフォルトの名無しさん
NGNGwindowsの32ビットモードのアプリで
intのハンドラを書きたい場合どうすればいいんでしょうか?
というか、OSが提供してる割りこみの種類がわからないんですが・・。
MSDNとかに載ってますか?
0069デフォルトの名無しさん
NGNGset_terminate()で設定した関数の中で例外をスローするとどうなるんだろう?
しないほうがいいのは前提として
0070デフォルトの名無しさん
NGNG0071デフォルトの名無しさん
NGNG0072山崎渉
NGNGピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。
=〔~∪ ̄ ̄〕
= ◎――◎ 山崎渉
0073デフォルトの名無しさん
NGNG0074デフォルトの名無しさん
NGNGで、OS依存の例外をキャッチするとか
あるいは電圧監視プログラムをバックグラウンドで走らせて、
電圧落ちたら運がよければ例外スロー
0075デフォルトの名無しさん
NGNG(´・ω・`)
0076_
NGNG0077デフォルトの名無しさん
NGNG使えない環境は関係ないし。
0078デフォルトの名無しさん
NGNGぶちこむと思うんだけど、どんな感じで入れる?
例えばWindowsのAPIがエラーを返してきた場合だと
エラーが発生したAPIと、APIに渡した引数、APIが出すエラーコード、
APIを呼んだ箇所によっては特別な対処用メッセージ、などなど。
これらをさっくりぶちこんだ例外オブジェクトを構築するコードを
1,2行で書けるような仕組みを作れればいいんだけど…
0079デフォルトの名無しさん
NGNG{
std::ostringstream ss;
// ぶちこむ
throw えら( ss.str() );
}
0080デフォルトの名無しさん
NGNG0081デフォルトの名無しさん
NGNGあと「コード1,2行で」っていうけど、マクロ使えば何行だって大差ないし。
008280
NGNG変なことを聞いてすいませんでした。
ほとんどのサイトで自前のExceptionとか定義してそこから派生させていたので
<exception>は普通あまり使われないのかと思ったんです。
008378
NGNGそれはそれで正しいと思うんだけど、
「コンピュータに詳しくないエンドユーザーが、エラー発生時に
どういう対応すればよいのか分かるように。」
「ユーザーを小難しいメッセージで混乱させないように」
というようなことを言い出されるとこれがなかなかむつかしい。
try {
foo(argument);
}catch (SomeException& e) {
//この例外の場合は原因メッセージが必要
throw HogeException(HogeMessage + "(原因は" + e.what() + ")");
}catch (OtherException& e) {
//eの種類によってはe.what()はユーザーに見せたくない
//argumentは見せる必要がある。
throw FugaException(FugaMessage + argument);
}
なんてやってるとどんどんふくれあがってゆく。
0084山崎 渉
NGNG__∧_∧_
|( ^^ )| <寝るぽ(^^)
|\⌒⌒⌒\
\ |⌒⌒⌒~| 山崎渉
~ ̄ ̄ ̄ ̄
0085山崎 渉
NGNG0086山崎 渉
NGNG│ ^ ^ │<これからも僕を応援して下さいね(^^)。
⊂| |つ
(_)(_) 山崎パン
0087デフォルトの名無しさん
NGNG0088デフォルトの名無しさん
NGNGDel厨は(#・∀・)カエレ!!
0089デフォルトの名無しさん
NGNGやっぱ、__finallyは無いですよね?
0090デフォルトの名無しさん
NGNG0091デフォルトの名無しさん
NGNG数段の関数呼び出しをした中の処理でプログレスバーが出て、
ユーザーがキャンセルできる場合、
キャンセルを例外としてthrowするのは問題ないでしょうか?
現状、エラーは例外をthrowするけども、
キャンセルだけは戻り値(二値)になっているコードがあって、
処理の結果を返したいときに戻り値が使えなくてちょっと不便に思っています。
0092デフォルトの名無しさん
NGNG問題ない。
エラークラスを派生して、エラーコードメンバを足せば?
0093デフォルトの名無しさん
NGNG意味的に例外じゃないのに。
安全なlongjmpとか用意すべきだったと思わない?
0094デフォルトの名無しさん
NGNGバックトラックって,用意したスタックをロールバックするだけじゃない?
0095デフォルトの名無しさん
NGNG> 安全なlongjmpとか用意すべきだったと思わない?
それがexception。
0096デフォルトの名無しさん
NGNG0097デフォルトの名無しさん
NGNGそりゃ、catchを分岐させる必要があるときでわ?
0098デフォルトの名無しさん
NGNGchar *の文字列なんてものthrow出来るんだね。
組み込みだと便利かな?
0099デフォルトの名無しさん
NGNGとぼとぼやるよりは例外投げたほうがストレートでいいじゃん。
デストラクタを適切に実装していれば途中のオートオブジェクトも
自動的に消えて元にもどるわけだし。
システムコールのエラーもエラーリターンなんで
面倒なことはやめて全部例外投げる。
ってのは乱暴?
0100デフォルトの名無しさん
NGNG> 面倒なことはやめて全部例外投げる。
意味わからん。
0101デフォルトの名無しさん
NGNGint read_e(int fd, char *buf, size_t nbyte)
{
int r;
if(-1 == (r = read(fd, buf, nbyte)))
throw errno;
return r;
}
0102デフォルトの名無しさん
NGNGthrowでint投げるんだね。
intとchar *とどっちが良いのか迷ってまつ。
0103デフォルトの名無しさん
NGNG"error:〜"みたいにべた書きしとけば大丈夫?
0104デフォルトの名無しさん
NGNGstaticで定義しとくとか
0105100
NGNGん?
「エラーリターンなんて面倒なことはやめて全部例外投げる」
ってことか。それなら納得。
でも、 throw errno; はあんまりだな。
systemcall_errorとか、専用の型を作って、
what()でstrerror()が出るようにするのがよさそう。
0106デフォルトの名無しさん
NGNGエラーオブジェクトが関数のスコープ抜けたら消滅しても困るし、
上位でcatchされてスコープ抜けたらオブジェクトが消滅した方が良いし。。。
0107デフォルトの名無しさん
NGNGC++/Javaなら、例外の基底クラスがあるので、
そいつから継承したものにするのがマナー。
C++でthrowに渡したオブジェクトは、
必ずコピーされたものがcatchに渡されるので、
特別な寿命管理は必要ない。
0108デフォルトの名無しさん
NGNGなんと、HEWのC++には例外基底クラスも無ければ、STLも無い。
ついでに、char *に使えるのはどうなってるかも教えて。
ローカル変数のcharのポインタはやっぱダメ?
0109デフォルトの名無しさん
NGNG別にポインタ自体の入れ物はローカル変数でもいいが
その参照する文字列がプログラムスタック上に確保されるような場合は×
静的に領域を確保しておくか、例外を投げるときにnew、catchステートメントでdelete
JavaだとガベージコレクトされるからnewでもいいんだがC++だと明示的に
deleteしてやんないとね
0110デフォルトの名無しさん
NGNGタスクAでtryの中に入ってるとき、タスクBに制御が移り、
その最中でthrowしたらタスクAのcatchでとらえられたのはびっくりした。
例外ってそんなもんなの?HEWだけ?
あと、GCCもそうかもしれんが、ファイルをまたがって例外が飛ぶ時、
RTTIをチェックしないといけないのが引っかかった。
ま、STLもそうだけど、HEWはいままで触ったなかでかなり悲惨な部類の環境だなぁ。
0111デフォルトの名無しさん
NGNGその動作は至って普通です。
throwって要は「例外オブジェクト」をスタックやレジスタにセットして大域ジャンプ
してるだけなわけで。
アセンブラの言語レベルの理解は別にいらないけどスタックやプログラムカウンタ
まわりの概念が解ってればそんなに難しくないと思う
0112デフォルトの名無しさん
NGNG>その最中でthrowしたらタスクAのcatchでとらえられたのはびっくりした。
こうなると困るんだっけ?
普通な気がするが。
0113デフォルトの名無しさん
NGNG>ま、STLもそうだけど、HEWはいままで触ったなかでかなり悲惨な部類の環境だなぁ。
SH使ってまつ。HEWよりマシで、価格がそう変わらない環境教えて下さい。
0115デフォルトの名無しさん
NGNGその実行環境で言うところの、タスクって一体何?
それがほとんどモジュールと同じで、
システム全体でシングルタスクスケジュールで動いているのなら、
そういうこともあるだろうけども…
0116デフォルトの名無しさん
NGNGITRONの言うタスクはWinでいうスレッドのことでつ。
システム全体というか、機器全体で1つのEXEみたいなものですが、何か?
0117デフォルトの名無しさん
NGNGそれを保存するとこはどこなんでしょ?
HEWは例外機構を使う場合、例外を使うと明示的にコンパイラに指示する必要がありまして、
もし指示しなかった場合は__curr_stack_entry(だったか?)がリンクエラーになります。
つまり、ここに全ての場所の、例外の継続情報が保存されるんじゃないかと。
だからタスク間で勝手に例外がとんじゃったのかな?と考えてみた。
0118デフォルトの名無しさん
NGNGローカル変数のdestructorを実行しないといけないので、
ローカル変数のあるブロックごと、tryブロックごとに、
スタック上に印をつけておいて、それを実行環境が巻き戻しながら、
必要な処置を行っていきます。つまりスタックの操作を行います。
__curr_stack_entryってのは、
その現在のブロックのスタックを返す関数でしょう。(たぶんアセンブラ記述の)
0119デフォルトの名無しさん
NGNGHEWはITRONのタスクを知ってるわけじゃないから、
それは不可能ってこと?????
OSとコンパイラとセットじゃないと実装出来ないということかなぁ。
ITRONじゃC++実装不可能ってことか。
T-KernelはOSのソースを統合してるから対応可能なんかな、、、
0120デフォルトの名無しさん
NGNGなんか特別なことやってなければ、
例外処理でタスク間を移動することはない。
>>110はなんか勘違いしたが、
programのbugによる異常動作だと思う。
0121デフォルトの名無しさん
NGNG実際HEWでthrow使っている人は居ますか?
「throw -1」なのか「throw "error: details〜"」みたいなのか、
それとも、エラークラス(HEWには無いかな)派生してるんでしょうか?
0122デフォルトの名無しさん
NGNG0123デフォルトの名無しさん
NGNG自前のアプリ作る場合の例外って
どのクラスから派生してるの?
0124デフォルトの名無しさん
NGNG0125デフォルトの名無しさん
NGNGなっとく。
エラークラスを作れない環境では、エラー構造体でcatchを分岐するわけね。
で、空じゃなくて、構造体のメンバーにエラーコードとかエラー文字列入れたり。
0126デフォルトの名無しさん
NGNGそれ、エラークラス作れてるってことじゃないの。
0127125
NGNGあ、そか。
>>107 に例外の基底クラスを派生がマナーだけど、
C++だとメモリ管理不要って書いてあるね。
で、
{
if (false == hogehogeAPI() {
THogeErrorClass HogeError;
throw HogeError;
}
}
て感じ?
0128デフォルトの名無しさん
NGNGRTTIがないとcatchで分岐できませんからねえ。
0129127
NGNGclass THogeErrorClass {};
0130デフォルトの名無しさん
NGNGまあエラー原因文字くらい入れといた方が、
全部まとめて、
} catch (exception e) {
cerr << e.what() << endl;
exit(1);
}
出来て便利だけどね。
0131デフォルトの名無しさん
NGNGHEWなんかでも構造体にもRTTIあるんかなぁ。
こんなん書ける?
try
{
}
catch (stuct structhogehoge hogehoge)
{ }
catch (stuct structhoge hoge)
{ }
catch (...)
{ }
0132デフォルトの名無しさん
NGNG・言語仕様
ANSI/ISO規格に基づき、例外処理やテンプレート機能もサポートしています。
http://www.hitachi-hec.co.jp/seihin-k/h8ccon/h8ccon01.htm
だから大丈夫なはずだけど、規格完全適合とは書いてないから、
使っている人に聞いてね。
ちなみにHEWって実行環境じゃなくて、開発環境なんじゃないの?
0133デフォルトの名無しさん
NGNGそのサポートしています、ってのが怪しいんだな。
規格の適合しています、と書けないわけだし。
構造化例外はオプション設定で「Use try, throw and catch of C++」をチェックさせるという後ろ向きなサポート。
0134デフォルトの名無しさん
NGNGcatch(...)でも例外がキャッチできずにabortいっちゃう事があって困った。
結局、例外使うのやめたんだけど。
ま、こっち側のミスの可能性は捨てきれないんだけど・・・。俺一人でやってるわけじゃないし。
0135デフォルトの名無しさん
NGNGえ”ー。
構造化例外の良いところは複数人数で開発してても、正しいエラー処理が出来ることろでわ?
0136デフォルトの名無しさん
NGNGWin32では明確に違うものなんだけど
ここで言ってるのは同じものなの?
0137デフォルトの名無しさん
NGNGC++例外はオブジェクト指向だし。
0138デフォルトの名無しさん
NGNGWindowsとVC++独自のプラットフォーム/処理系依存の例外処理。
0139デフォルトの名無しさん
NGNG>>133(=>>135?)はC++例外と構造化例外がごっちゃになってるんじゃないの?
0140デフォルトの名無しさん
NGNGVCは関係無いんだけど、無知ですか?
0141デフォルトの名無しさん
NGNG制御構造はどっちも似てるし、この辺で元の議論へ。
構造化例外は例外オブジェクトなんて無いけど、throwみたいなもでしょ?
0142デフォルトの名無しさん
NGNG0143デフォルトの名無しさん
NGNGEmbedded C++に拘らず、メリットがあるからテンプレート(Embeddedには無い)なんかは使ってます、
だけど、
安全のためにthrowは使いません、て書いてあった。
catchしてれば良いだけでわ。
組込み的にthrowはどうやばいんだ?
組込み技術者がやヴぁい、というオチダタリシテ
0144デフォルトの名無しさん
NGNG守るべきでしょうか。
クラスライブラリに依存しちゃうしかないんかな。
0145デフォルトの名無しさん
NGNGライブラリなら、守ってたほうがありがたいと思う利用者が多いだろうな。
> クラスライブラリに依存しちゃうしかないんかな。
こっちは意味がわからん。
0146デフォルトの名無しさん
NGNG0147デフォルトの名無しさん
NGNGでも、どっちがいいかは微妙だなー。
こういうふうに迷わないように、新しいライブラリを作るなら標準例外クラスから派生して欲しいな。
0148デフォルトの名無しさん
NGNG> logic_errorかruntime_errorのどちらかから派生するそうですね。
細かい突っ込みすると、class ios_base::failureは違うけどね。
class ios_base::failure: public exception
{
[...]
};
> 守るべきでしょうか。
それって設計の問題なんで、こうすべきなんて答えは
ここで出てこないでしょう。あなたが導きださなければなりません。
まるで女のファッションみたいに、これって変かな?
なんてのと同じような感覚でこんな質問をするなら
もっとC++、さらにはプログラミングそのものの訓練が必要でしょう。
自分で設計上の結論を見出せないのですから。
などと突き放しては身もふたもないので、アドバイス。
たぶん、自分が用意しようとしている例外クラスがなんで必要なのか、
何をさせたいのかが見出せていないから、こういう質問になるのかと思います。
自問自答してみましょう。設計とは自問自答の繰り返しです。
> クラスライブラリに依存しちゃうしかないんかな。
んー、ちょっとわからんかった。ごめん。
0149デフォルトの名無しさん
NGNG> 守るべきでしょうか。
はい。
0150デフォルトの名無しさん
NGNGbad_alloc
bad_cast
bad_exception
bad_typeid
0151デフォルトの名無しさん
NGNG$ egrep -r 'public exception' /usr/include/c++/3.3/*
/usr/include/c++/3.3/bits/ios_base.h: class failure : public exception
/usr/include/c++/3.3/exception: class bad_exception : public exception
/usr/include/c++/3.3/new: class bad_alloc : public exception
/usr/include/c++/3.3/stdexcept: class logic_error : public exception
/usr/include/c++/3.3/stdexcept: class runtime_error : public exception
/usr/include/c++/3.3/typeinfo: class bad_cast : public exception
/usr/include/c++/3.3/typeinfo: class bad_typeid : public exception
な感じ。
0152デフォルトの名無しさん
NGNG基底クラスがExceptionになったり、を何とかして欲しい。
ショウガナイから使ってるが、組み込み系では使えない。
組み込み系ではthrowを無視するコンパイラやライブラリが多いから、問題が表面化して無いが。
0153デフォルトの名無しさん
NGNG> 基底クラスがExceptionになったり、を何とかして欲しい。
何を問題としているのかわかりません。
0154デフォルトの名無しさん
NGNGcatchするのが面倒なんじゃないの
0155デフォルトの名無しさん
NGNGC++言語的には無い方が良いが、使うときには例外クラスに文字かコードは必須。
0156デフォルトの名無しさん
NGNG「文字の付加情報」と、 std::exception::what() は違うの?
0157デフォルトの名無しさん
NGNG0158デフォルトの名無しさん
NGNG0159デフォルトの名無しさん
NGNG詰めないといけないのは頭の中身なんじゃあ…
0160デフォルトの名無しさん
NGNGおまえらちゃんと会話しろよ。
0161デフォルトの名無しさん
NGNGあれ、exceptionにwhat()あったっけ?
自分の認識では、logic_error、runtime_error、とかの派生で初めてアクセスで出来たような。。。
0162デフォルトの名無しさん
NGNGwhat() は exception で virtual 関数として定義されている。
runtime_error 等は what() の戻り値がコンストラクタの引数として渡せる。
0163デフォルトの名無しさん
NGNGで、VC++でexceptionの派生をしたけど、かなり大変だったぞ。
他コンパイラで通るかも分からないしめんどー。
0164デフォルトの名無しさん
NGNG何が大変だったの?
ふつうにオーバーライドするだけじゃダメってこと?
0165デフォルトの名無しさん
NGNG類推機能なしの脳には何でも初体験。
0166デフォルトの名無しさん
NGNGwhatを使うために、こんなんなってたぞ↓
class HogeError : public exception {
public:
explicit HogeError(const string& _S): exception(""), _Str(_S) {}
virtual ~HogeError(){}
virtual const char *what() const{return (_Str.c_str()); }
protected:
virtual void _Doraise() const {_RAISE(*this); }
private:
string _Str;
};
組み込みコンパイラとクロスのソースとして使うことを想定してて、
下位のエラークラス派生を行わずにexceptionを派生した模様。
なんか無駄に終わったっぽいが。
0167デフォルトの名無しさん
NGNGexception("")って通るのか?
_Doraise/_RAISEは何やってんの?
標準の環境だけ想定すれば、
class HogeError : public std::runtime_error
{
public: explicit HogeError(std::string const& s) : runtime_error(s) {}
};
これでおしまいなんだが。
まぁ環境がちょっと特殊っぽいな。
組み込みを想定すると、 runtime_error は使っちゃいけなくなるのか?
0168デフォルトの名無しさん
NGNGthrowはサポートするがエラー派生クラスどころかSTLから無い。
「using namespace std;」は書けないし、実はusing句もサポートせず。
0170デフォルトの名無しさん
NGNGstd::string str;
public:
explicit HogeError(const std::string& s) : str(s) {}
virtual const char *what() const { return str.data(); }
};
これだけで良いじゃないか。
そーいや、what()の戻り値ってc_str()じゃなくてdata()なんだよね。
0171デフォルトの名無しさん
NGNGそれはC++の問題でも、ましてやVC++の問題でもないと思うんだが。
0172デフォルトの名無しさん
NGNGつか、このスレは例外処理を使うときの話であって、おまいの方が擦れ違い。
”C++の問題でも、ましてやVC++の問題でもない”からどーだって言うんだ。
0173デフォルトの名無しさん
NGNG多分それの方が短くて良いんだろうが、その内容にしても書くの面倒でない?
0174デフォルトの名無しさん
NGNG0175デフォルトの名無しさん
NGNGruntime_error使った>>167のやつでも面倒だと思う?
0176デフォルトの名無しさん
NGNGはぁ?
>>163 で、VC++でexceptionの派生をしたけど、かなり大変だったぞ。
VC++(C++)でexceptionの派生クラスを作るのは「かなり大変」
という話題から派生してるだけだけど、どこに問題が?
>>166 whatを使うために、こんなんなってたぞ
ご丁寧に、自分で勝手に煩雑な書き方をしていただけというオチまでついてるし。
0177デフォルトの名無しさん
NGNG自分的には、1行であるべきだと思う。
class HogaType_exception : public exception {} ;
class HogeType_exception : public exception {} ;
と沢山作っといて、で、最上位でdynamic_castして分岐させて。
ところで176は邪魔だな。
複雑なソースがあるから、このスレで何とか解決しようと思ってるんだが、何度も絡んでくるな。
レスは要らないと言ってるのに、もうレスすんあ。
0178デフォルトの名無しさん
NGNG初期の頃って両方無かったような気がしたんだけど気のせい?
0179デフォルトの名無しさん
NGNG一行で書きたけりゃ、宣言と定義をわけたり、マクロを使ったり、いろいろできるだろ。勝手にやればいい。
最上位でdynamic_castって、catch並べて分岐しちゃダメなの?
> レスは要らないと言ってるのに
電波か?
0180デフォルトの名無しさん
NGNG0181デフォルトの名無しさん
NGNG176> ご丁寧に、自分で勝手に煩雑な書き方をしていただけというオチまでついてるし。
177の要件を満たす開発環境なんてねーし、何と比較してるんだよ。
そもそも、exceptionがあってruntimer_errorが無い環境ってのが想像不可能。
0183デフォルトの名無しさん
NGNGstd::string str;
public:
explicit HogeError(const std::string& s) : str(s) {}
virtual const char *what() const { return str.data(); }
};
これをマクロにして、組み込みコンパイラがコンパイルエラーなんか出したときにゃ、ガクブルだな。
C++は好きだけどライブラリの中は結構追いにくい。
0184デフォルトの名無しさん
NGNG0185デフォルトの名無しさん
NGNG連呼した方が勝ちってわけでもないのに。
0186デフォルトの名無しさん
NGNG一般には間違い。
例外クラスのコピーコンストラクタは例外を投げてはいけないので、
例えばこんな感じでラップする必要がある。
class HogeError : public exception {
boost::shared_ptr<std::string> str;
public:
explicit HogeError(const std::string& s)
: str(new std::string(s)) {}
virtual const char *what() const { return str->data(); }
};
stringが参照カウントで実装されているような処理系に依存していいならOK。
0187デフォルトの名無しさん
NGNGSTLの中の人が頑張ってくれてる、という考え方もあるが。
0188デフォルトの名無しさん
NGNGそこまでするんじゃ、やっぱりruntime_errorを継承するべきだな。
exceptionがokで、runtime_errorがNGなケースが思いつかないよ。
0189デフォルトの名無しさん
NGNGHEW環境。
0190デフォルトの名無しさん
NGNGbad_allocはその辺回避するためにwhat()がないんでしょうね。
0191デフォルトの名無しさん
NGNG定数文字列返せばいいだけじゃん。
0192デフォルトの名無しさん
NGNGあるよ。
0193デフォルトの名無しさん
NGNGローカルのchar[]は駄目なんだよね。
0194デフォルトの名無しさん
NGNGC/C++ではローカルのchar[]を戻り値にできないのはあたりまえ。
0195デフォルトの名無しさん
NGNG0196デフォルトの名無しさん
NGNG戻り値の型がstd::stringなら、どっちでもOK。
0197デフォルトの名無しさん
NGNGboostを使ったこと無いんですが、便利なんですか。
コンパイル通る環境はWin/POSIXくらいかな。
0198デフォルトの名無しさん
NGNGboostの中には様々なライブラリが入ってる。
使用できる環境もライブラリごとに違う。
一度使ってしまうと、使えない状況が苦痛になってしまうレベルのものが多い。
0199デフォルトの名無しさん
NGNGつぎつぎと珍妙度の高いライブラリを
摂取していかざるを得ないなんて。
0200デフォルトの名無しさん
NGNGだれも「珍妙度が高い」とも「つぎつぎと摂取していかざるを得ない」とも言ってないわけだが。
電波か?
0201デフォルトの名無しさん
NGNGでないと困る。
0202デフォルトの名無しさん
NGNG0203デフォルトの名無しさん
NGNGそんな予定は無い
0204デフォルトの名無しさん
NGNG一部は標準ライブラリに含まれる予定。
全部ではない。
0205デフォルトの名無しさん
NGNG0206デフォルトの名無しさん
NGNG0207デフォルトの名無しさん
NGNGboost::preprocessorならOKだよ。
0208デフォルトの名無しさん
NGNG例外をListやVectorに蓄積する必要もなくなってかなりええねえ。
org.apache.commons.lang.exception.NestableException
http://www.jajakarta.org/commons/lang-2.0/ja/withoutPrimary/org/apache/commons/lang/exception/NestableException.html
org.apache.commons.lang.exception.NestableRuntimeException
http://www.jajakarta.org/commons/lang-2.0/ja/withoutPrimary/org/apache/commons/lang/exception/NestableRuntimeException.html
0209デフォルトの名無しさん
NGNGま た C# の パ ク リ で す か
0210デフォルトの名無しさん
NGNGせっかくだから最近の Windows にあるような Vectored Exception Handling も
あると良いのだけれども。オープンソースの世界だと需要がないのかな。
0211デフォルトの名無しさん
NGNG0212デフォルトの名無しさん
NGNG同様に、ITRONのタスクでthrowしてそのタスクでcatchしなかった場合、メインタスクのcatchにジャンプするんでしょうか?
0213デフォルトの名無しさん
NGNG0214デフォルトの名無しさん
NGNG0215デフォルトの名無しさん
NGNG両方とも「しない」
0216デフォルトの名無しさん
NGNG0217デフォルトの名無しさん
NGNGcppファイル郡にcソースを平気で入れたり、コピペ・コーディング、といった程度でなく、
ソースファイルのコピー利用やプロトタイプ宣言をcソースに記述が平気な人たちが、
戻り値は駄目だ!これからはthrowだ!、という思いになるような説明キボン
0218デフォルトの名無しさん
NGNG0219デフォルトの名無しさん
NGNG標準ライブラリをリンクできない環境とかで、
例外処理ルーチンを自分で書ければ例外使えるんだけど、なんとかならん?
0220デフォルトの名無しさん
NGNGマニアックだね
0221デフォルトの名無しさん
NGNG■ このスレッドは過去ログ倉庫に格納されています