Windows 上で無効な fgetpos 呼び出しを C++ 例外としてキャッチするにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/5053977

質問

Visual C++ 2008 で、次に示すように生成された例外を「キャッチ」したいとします。

try {
    int foo = 20;
    ::fgetpos(0, (fpos_t*)&foo);
}
//...

キャッチを成功させるために私が行った調整は次のとおりです。

  1. SEH が有効になります (/eha)
  2. キャッチを追加しました(...)
  3. を追加しました _set_se_translator ベクター。
  4. SEH 構文を追加/調整しました。__try / __以外(EXCEPTION_EXECUTE_HANDLER)

つまり、「本に載っていることはすべて」試しましたが、まだ例外をキャッチできません。に電話を置き換えると、 ::fgetposint hey = foo / 0 その後、突然、上記のテクニックがすべて期待どおりに機能するようになります。だから私が扱っている例外は ::fgetpos どういうわけか「特別」です。

この ::fgetpos エラーが捕捉できないように見える理由と、それを回避する方法を誰かが説明できますか?

アップデート VS IDE で実行すると、出力ウィンドウには例外が表示されません。書かれているのは次のとおりです。

Microsoft Visual Studio C ランタイム ライブラリは、MyProgram.exe で致命的なエラーを検出しました。

あまり役に立ちません。コマンド ラインからコンソール アプリを実行すると、クラッシュ ダイアログが表示されます。ダイアログの「問題の詳細」セクションには次の情報が含まれます。

問題イベント名:BEX
例外オフセット:0002fd30
例外コード:c0000417
例外データ:00000000
追加情報 1:69ad
追加情報 2:69addfb19767b2221c8e3e7a5cd2f4ae
追加情報 3:b1ff
追加情報 4:b1ffca30caddc78c19f19b6d150997f

役に立ちましたか?

解決

ダンプ内のコードは以下に対応しているため、 STATUS_INVALID_CRUNTIME_PARAMETER, 、 試す _set_invalid_parameter_handler

他のヒント

ほとんどの場合、ランタイムは例外をキャッチし、例外を返したり伝播したりせずにデバッグ ダイアログを発行します。これは CRT 呼び出しであり、そこに好みの例外キャッチ コードを追加する可能性があります。ライブラリ関数内でハードウェア例外をキャッチすることは Visual Studio の権利の範囲内です。 特に IDE 内から実行している場合、またはデバッグ モードで実行している場合は、 期待される ランタイムの。

もちろん、ゼロで除算する場合、追加のキャッチ コードを記述するためのライブラリ呼び出しは存在しません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top