6

Visual Studio 2013 でハードウェアとソフトウェアの例外を調べています。「C++ 例外を有効にする」オプションを /EHa (SEH 例外ではい) に設定することで、ハードウェア例外をキャッチできることがわかっています。次の例外をキャッチしようとしています。

EXCEPTION_ARRAY_BOUNDS_EXCEEDED - キャッチできませんでした

EXCEPTION_ACCESS_VIOLATION - キャッチ

EXCEPTION_INT_OVERFLOW - キャッチしませんでした

EXCEPTION_INT_DIVIDE_BY_ZERO - キャッチ

これはコードの例です。

try {
    a = std::numeric_limits<int>::max();
    a += 5;
}
catch (...){

    std::cout << "EXCEPTION_INT_OVERFLOW Exception Caught" << std::endl;
    exit(1);
}

try {
    int h = 0;
    b = b / h;
}
catch (...){

    std::cout << "EXCEPTION_INT_DIVIDE_BY_ZERO Exception Caught" << std::endl;
    exit(1);
}

ゼロ除算の例外のみをキャッチします。これはプロセッサに依存していますか、それとも他に何かありますか? もう 1 つ質問があります。デバッグ ビルドとリリース ビルドに違いはありますか?

4

1 に答える 1

3

これはプロセッサに依存していますか

うん。OS は、ハードウェア トラップを構造化された例外にマップするだけで、ハードウェアが検出しない条件を検出するロジックを追加しません。(一方で、JVM や CLR などの管理されたフレームワークはロジックを追加することがよくあります。もちろん、これらをソフトウェアでキャッチするとパフォーマンスが低下しますが、実際にトラップが発生しない限り、ハードウェア トラップ ロジックは無料です。)

EXCEPTION_INT_OVERFLOWこれは、 x86 プロセッサで受信できないということではありません。しかし、その条件はあなたが期待するものではありません -- 加算中の単なるラップアラウンドではトラップは発生しません。Raymond Chen のブログ エントリを参照してください。

于 2015-04-19T22:35:26.927 に答える