・VC++.NET 2003
・Windows XP SP2
・Win32 アプリケーション(SDK)
size.addValue() で ULONGLONG 型に数値を加算していき、
2^64-1 の値を加算しようとすると例外が発生するようになっています。
それでマウスを左クリックすると 12345 を加算するようなサンプルを作った。
try{
size.addValue( 12345 ); ←ERR_OVERFLOW 定数を throw する
}
catch( int no ){
if ( no == ERR_OVERFLOW ){
MessageBox( hWnd, TEXT("オーバーフローしました。"), TEXT("確認"), (MB_ICONWARNING | MB_OK) );
}
else{
MessageBox( hWnd, TEXT("不明な例外エラーです。"), TEXT("確認"), (MB_ICONWARNING | MB_OK) );
}
}
上記の処理で 12345 を加算していくとやがてオーバーフローを起こします。
なお、size.addValue() ではちゃんと例外が発生しています。ここは問題がない。
それで質問は、例外が発生するとメッセージボックスが表示されずに
『Microsoft Visual C++ Runtime Library』というダイアログが表示され[OK]ボタンを
押すとプログラムが強制終了します。なぜ、catch で例外を受け取れずに勝手なダイアログが
表示されて強制終了するのか分かりません。
catch で例外を受け取って自分でメッセージボックスを出したいのですが、
どうすればよいのですか?
try〜catch は今回初めて使ってみました。
分かる方、お願いします。
ERR_OVERFLOWの型がintではないのではないでしょうか。
catch(int)で受けられる例外はint型のみです。
intに暗黙変換できるenumやshortなどが投げられてもcatch(int)では受けられませんので注意。
yoh2 さん、有り難うございます。
お察しの通り ERR_OVERFLOW は enum 型の定数です。
ERR_OVERFLOW を記号定数で定義してコンパイルしなおしたら出来ました。
過去に同様の経験があったのですか?すごい勘です。
とにかく問題がすっきりと解決しました。
暗黙の変換が利かないのはC++の例外初心者がよくハマルありがちなミスです。
常日頃から例外を意識してる人は結構簡単に気づくのでは。
Ban さんへ。
例外処理でよくハマルありがちなことでしたか。
今回初めて try〜catch を使ってみたため全く信じがたい出来事に思えたよ。
参考になりました。
ツイート | ![]() |