try〜catchを自分で処理するには?

解決


夏みかん  2007-05-02 11:58:36  No: 65023

・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 は今回初めて使ってみました。
分かる方、お願いします。


yoh2  2007-05-02 13:04:52  No: 65024

ERR_OVERFLOWの型がintではないのではないでしょうか。
catch(int)で受けられる例外はint型のみです。
intに暗黙変換できるenumやshortなどが投げられてもcatch(int)では受けられませんので注意。


夏みかん  2007-05-02 15:24:23  No: 65025

yoh2 さん、有り難うございます。
お察しの通り ERR_OVERFLOW は enum 型の定数です。
ERR_OVERFLOW を記号定数で定義してコンパイルしなおしたら出来ました。
過去に同様の経験があったのですか?すごい勘です。
とにかく問題がすっきりと解決しました。


Ban  2007-05-03 06:15:15  No: 65026

暗黙の変換が利かないのはC++の例外初心者がよくハマルありがちなミスです。
常日頃から例外を意識してる人は結構簡単に気づくのでは。


夏みかん  2007-05-04 10:06:41  No: 65027

Ban さんへ。
例外処理でよくハマルありがちなことでしたか。
今回初めて try〜catch を使ってみたため全く信じがたい出来事に思えたよ。
参考になりました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加