コードで例外をキャッチ
-
05-07-2019 - |
質問
ゼロ除算例外がキャッチされているかどうかを確認するために、次のコードを試しました:
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の場合、コンパイラオプションにすることができます。 ただし、標準では例外はスローされません。