5ちゃんねる ★スマホ版★ ■掲示板に戻る■ 全部 1- 最新50  

■ このスレッドは過去ログ倉庫に格納されています

例外処理exception, runtime_errorの使い方

1 :デフォルトの名無しさん:03/04/30 17:10
例外処理の使い方、問題点を検討。

先ず1問目。
std::runtime_errorでエラー文字列を上に渡すことが出来ます。
しかし、多国語対応だとクラスの中に膨大な文字を持つようになります。
かといって、エラー文字列取得クラスなんて用意する、汎用的なクラスになりません。
やっぱ、runtime_errorは捨てて、素直にexceptionを派生するべき?

2 :デフォルトの名無しさん:03/04/30 17:12
get_2_exception

3 :デフォルトの名無しさん:03/04/30 17:12
先生、わかりません

4 :デフォルトの名無しさん:03/04/30 17:31
織田信長について語ってるの?

5 :デフォルトの名無しさん:03/04/30 17:39
そうそう、織田信長って良く構造化例外使ってたよね。

6 :デフォルトの名無しさん:03/04/30 20:12
既存スレへどうぞ。

C++相談室 part18
http://pc2.2ch.net/test/read.cgi/tech/1050177746/

7 :デフォルトの名無しさん:03/05/01 00:07
文法じゃなくてアプリ構造についても考えたいYO!

8 :デフォルトの名無しさん:03/05/01 00:12
特にエラー例外ってのにこだわらなければ使い道はいろいろあるかと。
たとえば、シーンチェンジに使ってたりします。


9 :デフォルトの名無しさん:03/05/01 00:15
>>8
そういう使い方はやめろ。

10 :デフォルトの名無しさん:03/05/01 00:42
>>9
なんで?結構便利だなって思ってたんだけど。
私はプログラムの経験が少ないんで問題に気づいてないのかもしれないですね。
できればシーン変更の標準的な方法を教えてほしい。

11 :デフォルトの名無しさん:03/05/01 08:39
>シーンチェンジ
なんだけ?RPG?

12 :デフォルトの名無しさん:03/05/01 12:51
多重whileから一気に抜ける時に使います
gotoよりはいいでしょ。

13 :デフォルトの名無しさん:03/05/01 13:00
例外は遅くは無いとは聞いたことあるけど。

14 :動画直リン:03/05/01 13:13
http://homepage.mac.com/hitomi18/

15 :デフォルトの名無しさん:03/05/01 13:16
多重whileというかメソッドからメソッドを呼んでとか多重入れ子になってる状態で
一気に親メソッドに戻りたいときはいいね。

16 :デフォルトの名無しさん:03/05/01 13:23
>>12
おいおい

17 :NullPointerExceptionはぬるぽ:03/05/01 13:41
別会社のとあるコードみたときに、
本チャンコードが5行程度で
例外処理が30行以上のコード見たことがある。

「なんでや?」と聞くと
「あ、それ0で助産したときの処理です」とこきやがった。
確かにそのとおりだったが

・・・


18 :デフォルトの名無しさん:03/05/01 16:10
>>17
構造化例外にすると1行になるコードかい?

19 :デフォルトの名無しさん:03/05/03 01:55
>17
例外処理のコードが少なすぎるって言いたいのかな?

20 :デフォルトの名無しさん:03/05/06 14:57
エラーメッセージの扱いどうしよう。

多言語対応したくて、組み込みからWindowsをカバーしたい場合。

21 :デフォルトの名無しさん:03/05/06 15:02
gettextを使う

22 :デフォルトの名無しさん:03/05/08 05:05
スロウラブルで幸せを掴もう。

23 :デフォルトの名無しさん:03/05/08 05:07
>>17
例外処理で30行?いいんでないの?
サーブレットの話しだけど例外発生したらエラー画面に飛ばすとかの処理
書いたらそれくらいならない?
画面に飛ばす処理を共通化するならn行で済むけど。

24 :デフォルトの名無しさん:03/05/08 08:04
漏れはもっぱら RuntimeException の例外しか作らん

25 :デフォルトの名無しさん:03/05/08 08:36
今までBCBだったので、
throw Exception("")
したら、メッセージボックス出力されてました。
が、MFCのプログラムだと異常終了します。
MFCな人達はどうしてますか?

26 :25:03/05/08 09:18
ちなみに、MFCではthrow runtime_errorしてますが、
やっぱ、トラップを自分で書くしか無いかな。
BCBのプロジェクトファイルみたいなのはどこにあるんだろう。

27 :デフォルトの名無しさん:03/05/08 12:21
自作例外クラスはどう設計すればいいでしょう?

Exceptionクラスを継承してコンストラクタでsuper(String message)を呼び出しているだけで
終わってしまっていますが・・・

28 :デフォルトの名無しさん:03/05/08 12:38
http://www.boost.org/more/error_handling.html

29 :デフォルトの名無しさん:03/05/09 00:00
std:::bad_alloc例外投げる時にさらにメモリ不足になったりしないかと夜も眠れません

30 :デフォルトの名無しさん:03/05/09 00:25
>>25-26
CWinApp派生クラスのInitInstance, ExitInstanceと、
メインウィンドウのWindowProcでtry-catchしてSEH以外は全部捕まえてる。
特別なエラー処理をしたいハンドラはそのハンドラで独自にtry-catch。

>29
MFCのAfxThrowMemoryExceptionは
グローバル変数へのポインタを飛ばしてるだけだから
メモリを確保しない…んじゃなかったかな。

std::exception派生クラスでそういう仕組みは作れる?

31 :デフォルトの名無しさん:03/05/09 00:48
> そういう仕組み
ってなあに?

32 :デフォルトの名無しさん:03/05/09 09:59
bad_allocとruntime_errorと、多重継承出来る?

33 :デフォルトの名無しさん:03/05/09 11:41
「Javaの鉄則」本に、例外が現れたらそれらを上書きで隠さずにVectorクラスに溜め込む
技があったな。

Vectorに溜め込む専用の例外クラスまで用意していたが、
汎用性がどれだけ高くなるか疑問。

34 :デフォルトの名無しさん:03/05/09 15:26
>例外が現れたらそれらを上書きで隠さずにVectorクラスに溜め込む

役に立つの?
役に立つなら、C++版を作成しようかな、と。

35 :デフォルトの名無しさん:03/05/09 18:54
>>30
WindowProcでキャッチするのは確かに気持ちいいんだが、
例外をOSのDLLのスタックを通過させないように注意しろよ。動作が不定になるぞ。
サブクラス化した場合とかは特に、そっちのWindowProcでもちゃんと全catchするように。

36 :30:03/05/09 19:11
>>35
何か大変だね。やめとこう。
BCBなら普通に出来ることなのにね。
TApplication::OnExceptionていうイベントハンドラさえあるのに。

37 :bloom:03/05/09 19:13
http://homepage.mac.com/ayaya16/

38 :デフォルトの名無しさん:03/05/09 19:36
>>36
別に大変ではないからやりなさい。

39 :30:03/05/10 01:33
>>31
えーと、MFCの場合は
CSomeException g_GlobalException ; //CException派生、グローバル変数

throw &g_GlobalException ;
とポインタを投げるので例外処理時にメモリを新たに確保しない。
(スタックは使うのかな。分かんない)

STLだと
MyException g_E ; //std::exception派生、グローバル変数

throw g_E ;
と投げて受け側が
catch(std::exception& e)
と受けてもどこかで例外オブジェクトがコピーされちゃうんじゃない、か、
と思っちゃったんだけど…

コピーされないか。されませんね。すみませんでした…

40 :30:03/05/10 01:37
>>35
げ!?
OSのDLLのスタックを通過って、
DispatchMessage API の外側でtry-catchしちゃまずいとかそういうこと?
全然意識してなかったよ…。

#ところでこのスレって環境依存の話ばっかりしちゃまずい?

41 :30:03/05/10 01:41
>>36
って、キミは誰だ?オレか?

MFCにもCWinApp::ProcessWndProcException
というのがあるけどCException派生の例外しか処理してくれないのでね。

42 :デフォルトの名無しさん:03/05/10 06:52
ぼく知ってるよ。throwで投げたものはぜったいコピーされるんだ。

43 :デフォルトの名無しさん:03/05/10 10:07
dll内の関数が投げた例外って、dll内でcatchしないとアプリ落ちちゃいません?

44 :デフォルトの名無しさん:03/05/10 11:22
OSがDLLを提供するのは良いが、OSのDLLは関数ベースで例外出さなくて綺麗だよね。
VC++なんかの、DLLの例外をアプリがcatchすること自体キショイような気がする。

45 :デフォルトの名無しさん:03/05/10 17:08
>>28
うわっ、例外のコピーコンストラクタが例外を投げたら、terminate()
呼ばれるんだ。コンストラクタが例外投げたときと同じように、
新しい例外の方が有効になるんだとばっかり思ってた。
でも、よく考えると、例外オブジェクトの領域は普通は一箇所だから、
新しく例外を投げようとするとオブジェクトを上書きしてしまうのか。

46 :動画直リン:03/05/10 17:13
http://homepage.mac.com/hitomi18/

47 :デフォルトの名無しさん:03/05/12 17:07
VC++/MFCで、
std::runtime_errorを派生したいんですが、
なんかコンパイルエラーの嵐です。サンプルきぼんぬ。

48 :動画直リン:03/05/12 17:13
http://homepage.mac.com/hitomi18/

49 :デフォルトの名無しさん:03/05/12 18:21
↑ぬるぽ刑

50 :デフォルトの名無しさん:03/05/12 22:50
以前読んだ本に
「コンストラクタで例外を投げるのはオススメできない」
って書いてあったんですけどコレはなんででしょう?
特に理由も書いてなかったし

今までバリバリ例外投げてたんですけど、これってマズイ?

51 :デフォルトの名無しさん:03/05/13 00:43
マズクナーイ


52 :デフォルトの名無しさん:03/05/13 01:05
>50
MSDNの"Deep C++"にあれこれ書いてある。
ttp://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpdndeepc/htm/deep01202000.asp

どうせアプリケーションを終了させなきゃならないような例外だったら投げても
いいかと思うけど。

53 :デフォルトの名無しさん:03/05/13 01:11
>>52
第14部だけ張るとは、恐ろしい罠だな。
気をつけろよ。>>50

54 :デフォルトの名無しさん:03/05/14 02:06
つうか俺はほとんどコンストラクタ位でしか例外を投げてない

55 :52:03/05/15 00:10
>53
おお、言われてみれば。13部〜16部くらいがこのあたりの話。
でも全編読むべきなのだろうな。
…なんか難しくてよく分からんのだが。

56 :デフォルトの名無しさん:03/05/15 00:11
なんか和訳がわかりにくいな

57 :デフォルトの名無しさん:03/05/15 01:32
>>55
問題は、14部から後に筆者の意見が逆転してることだな。

58 :デフォルトの名無しさん:03/05/15 21:40
例外というのかわかんないんだけど、
Windowsアプリでint系の割りこみハンドラって作れるの?

59 :デフォルトの名無しさん:03/05/16 00:08
 作れる

60 :デフォルトの名無しさん:03/05/16 00:37
例えば、
奇数アドレスを参照しようとしたら例外(int)飛ばす事にしたいんだけど、
できるんでしょうか。

61 :デフォルトの名無しさん:03/05/16 01:04
そもそも奇数参照で例外出す機能がx86にあったか?
ペナルティで実行クロック余計にかかるだけでは・・・最近の知らんが。
モトロラとかあっちならあったな。

62 :デフォルトの名無しさん:03/05/16 01:08
無理やりunsigned longあたりにキャストして0x01とAND

63 :デフォルトの名無しさん:03/05/16 02:56
MSVCP60.DLLから飛んでくるstd::ios::failureがstd::exceptionで捕まえられないんですが、
心当たりの在る方はいらっしゃいませんか。
RTTI有効にしてるのがイカンのだろうか・・・

64 :デフォルトの名無しさん:03/05/16 10:03
例外処理って使いどころがわからん・・・

65 :デフォルトの名無しさん:03/05/16 11:05
例外処理しなければアプリが不正に動作してデータ壊したり、異常終了するだけですが...

66 :デフォルトの名無しさん:03/05/16 11:14
>>64の言う例外処理はC++のtry&catchのようなものを指すのでは。

if使って書くよりよほど見やすいと思うけど・・・

67 :デフォルトの名無しさん:03/05/16 16:01
たとえば、ファイルの入力をストリームと見た場合、
終端(EOF)は例外。

68 :デフォルトの名無しさん:03/05/16 16:21
>>59
windowsの32ビットモードのアプリで
intのハンドラを書きたい場合どうすればいいんでしょうか?
というか、OSが提供してる割りこみの種類がわからないんですが・・。
MSDNとかに載ってますか?

69 :デフォルトの名無しさん:03/05/17 01:37
例外をキャッチしないとterminate()が呼ばれるわけだけど
set_terminate()で設定した関数の中で例外をスローするとどうなるんだろう?
しないほうがいいのは前提として

70 :デフォルトの名無しさん:03/05/17 01:49
鼻から悪魔

71 :デフォルトの名無しさん:03/05/23 08:56
mainがC言語だと、throwするのも不安だね。

72 :山崎渉:03/05/28 12:50
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉

73 :デフォルトの名無しさん:03/06/17 11:16
電源が抜かれたときにもファイルが妥当にクローズされてるような例外ってどう書けばよいですか?

74 :デフォルトの名無しさん:03/06/17 23:05
マシンにUPSつけるしかないだろ。
で、OS依存の例外をキャッチするとか

あるいは電圧監視プログラムをバックグラウンドで走らせて、
電圧落ちたら運がよければ例外スロー



75 :デフォルトの名無しさん:03/06/25 02:48
みんな例外に興味ないすか・・・
(´・ω・`)

76 :_:03/06/25 02:57
http://homepage.mac.com/hiroyuki44/

77 :デフォルトの名無しさん:03/06/25 03:12
使える環境では日常的に使いすぎて、書き込むようなネタはない。
使えない環境は関係ないし。

78 :デフォルトの名無しさん:03/06/27 01:29
例外オブジェクトの中にエラーメッセージを構築するための情報を
ぶちこむと思うんだけど、どんな感じで入れる?

例えばWindowsのAPIがエラーを返してきた場合だと
エラーが発生したAPIと、APIに渡した引数、APIが出すエラーコード、
APIを呼んだ箇所によっては特別な対処用メッセージ、などなど。

これらをさっくりぶちこんだ例外オブジェクトを構築するコードを
1,2行で書けるような仕組みを作れればいいんだけど…

79 :デフォルトの名無しさん:03/06/27 02:54
if( えら? )
{
 std::ostringstream ss;
 // ぶちこむ
 throw えら( ss.str() );
}

80 :デフォルトの名無しさん:03/06/27 03:14
exception 継承して what() でエラーを得てはダメなんでしょうか??

81 :デフォルトの名無しさん:03/06/27 19:02
俺はふつうにそうやってるけど。なんで「ダメ」だと思うのさ?

あと「コード1,2行で」っていうけど、マクロ使えば何行だって大差ないし。

82 :80:03/06/27 21:20
>>81
変なことを聞いてすいませんでした。

ほとんどのサイトで自前のExceptionとか定義してそこから派生させていたので
<exception>は普通あまり使われないのかと思ったんです。

83 :78:03/07/01 03:39
>79-82
それはそれで正しいと思うんだけど、
「コンピュータに詳しくないエンドユーザーが、エラー発生時に
どういう対応すればよいのか分かるように。」
「ユーザーを小難しいメッセージで混乱させないように」
というようなことを言い出されるとこれがなかなかむつかしい。

try {
foo(argument);
}catch (SomeException& e) {
//この例外の場合は原因メッセージが必要
throw HogeException(HogeMessage + "(原因は" + e.what() + ")");
}catch (OtherException& e) {
//eの種類によってはe.what()はユーザーに見せたくない
//argumentは見せる必要がある。
throw FugaException(FugaMessage + argument);
}

なんてやってるとどんどんふくれあがってゆく。

84 :山崎 渉:03/07/15 10:32

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄

85 :山崎 渉:03/08/02 02:53
(^^)

86 :山崎 渉:03/08/15 17:58
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン

16 KB
■ このスレッドは過去ログ倉庫に格納されています

★スマホ版★ 掲示板に戻る 全部 前100 次100 最新50

read.cgi ver 05.04.00 2017/10/04 Walang Kapalit ★
FOX ★ DSO(Dynamic Shared Object)