1

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

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

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

  1. SEHがアクティブになります(/ eha)
  2. キャッチを追加しました(...)
  3. _set_se_translatorベクトルを追加しました。
  4. SEH構文に追加/調整しました:__ try / __except(EXCEPTION_EXECUTE_HANDLER)

要するに、私は「本の中のすべて」を試しましたが、それでも例外を捕まえることができません。の呼び出しをに置き換える::fgetposint hey = foo / 0、突然、上記のすべての手法が期待どおりに機能します。ですから、私が扱っている例外は、::fgetposどういうわけか「特別な」ものです。

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

update VS IDEで実行すると、出力ウィンドウに例外の名前が付けられません。それが言うのはこれだけです:

Microsoft VisualStudioCランタイムライブラリがMyProgram.exeで致命的なエラーを検出しました。

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

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

4

2 に答える 2

3

ダンプ内のコードはに対応しているのでSTATUS_INVALID_CRUNTIME_PARAMETER、試してみてください_set_invalid_parameter_handler

于 2011-02-19T23:23:50.787 に答える
2

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

もちろん、ゼロで除算すると、その余分なキャッチコードを記述するためのライブラリ呼び出しはここにはありません。

于 2011-02-19T22:55:54.597 に答える