4

ゼロ除算例外がキャッチされているかどうかを確認するために、次のコードを試していました。

int main(int argc, char* argv[])
{
    try
    {
      //Divide by zero
        int k = 0;
        int j = 8/k;
    }
    catch (...)
    {
        std::cout<<"Caught exception\n";
    }
    return 0;
}

これを VC6 でコンパイルすると、catch ハンドラが実行され、出力は "Caught exception" でした。しかし、これを VS2008 でコンパイルすると、catch ブロックを実行せずにプログラムがクラッシュしました。違いの理由は何ですか?

4

4 に答える 4

5

プロジェクトの下で構造化例外処理を有効にします -> プロパティ -> 構成プロパティ -> c/c++ -> コード生成 -> c++ 例外を有効にします。

try except を使用します。理想的には、例外コードをチェックし、キャッチしたい場合は一定のシグナルを返すフィルターを使用します。ここではスキップしましたが、フィルターの例についてはこちらを参照することをお勧めします。

#include <iostream>
#include <windows.h>

int main(int argc, char* argv[])
{
    __try
    {
        //Divide by zero
        int k = 0;
        int j = 8/k;
    }
    __except(EXCEPTION_EXECUTE_HANDLER)
    {
        if(GetExceptionCode()==EXCEPTION_INT_DIVIDE_BY_ZERO)
            std::cout << "Caught int divison exception\n";
        else
            std::cout << "Caught exception\n";

        system("pause");
    }
    return 0;
}
于 2009-03-08T10:44:14.493 に答える
2

Microsoft の構造化例外処理 (SEH) レイヤーによって生成された例外をキャッチしています。これは、Microsoft に固有のオペレーティング システムです。Mykola が示唆したように、コンパイラ オプションをいじる必要があるかもしれませんが、このコードは他のオペレーティング システムや、Windows で実行されている他のコンパイラに移植できなくなることに注意してください。

于 2009-03-08T10:38:34.040 に答える
1

プロジェクトのプロパティに移動し、C/C++、コード生成の下に、「C++ 例外を有効にする」があります。このオプションを「Yes, With SEH Exceptions」に変更します

これらの種類の例外は、次のいずれかを使用してのみキャッチできることに注意してください。

  • try {} catch(...) {} (省略記号付き)
  • __try {} __except() {}(適切なフィルターを使用__except)
  • を使用してSetUnhandledExceptionFilter()

の有効な値については、__except こちらを参照してください

于 2009-03-08T10:57:34.087 に答える
0

Visual Studio の場合は、コンパイラ オプションです。ただし、標準では例外はスローされません。

于 2009-03-08T10:34:06.983 に答える