質問

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

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ブロックを実行せずにプログラムがクラッシュしました。違いの理由は何ですか?

役に立ちましたか?

解決

プロジェクトで構造化例外処理を有効にする-&gt;プロパティ-&gt;設定プロパティ-&gt; c / c ++-&gt;コード生成-&gt; 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;
}

他のヒント

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

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

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

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

__ except の有効な値の場合こちら

をご覧ください

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

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