/EH (例外処理モデル)
コンパイラで使用する例外処理モデルを指定し、例外の結果として適用範囲の外になる C++ オブジェクトを破棄します。/EH が指定されていない場合、コンパイラは構造化例外と C++ 例外をキャッチし、例外の結果として適用範囲の外になる C++ オブジェクトを破棄しません。
/EH{s|a}[c][-]
引数
a
非同期 (構造化) 例外と同期 (C++) 例外をキャッチする例外処理モデル。s
C++ 例外のみをキャッチし、extern C 関数が例外をスローすると想定するようにコンパイラに指示する例外処理モデル。c
s (/EHsc) と共に使用すると、C++ 例外のみをキャッチし、extern C 関数が C++ 例外をスローしないと想定するようにコンパイラに指示します。/EHca は /EHa と同じです。
解説
/EHs を使用して、同期例外処理モデル (構造化例外処理の例外のない C++ 例外処理) を指定します。/EHs を使用すると、catch 句は非同期例外をキャッチしません。また、非同期例外が処理される場合であっても、非同期例外の生成時にスコープ内にあるすべてのオブジェクトは破棄されません。/EHs が指定されている場合は、catch(...) は C++ 例外だけをキャッチします。アクセス違反および System.Exception 例外はキャッチされません。
/EHa を使用して、非同期例外処理モデル (構造化例外処理の例外のある C++ 例外処理) を指定します。/EHa を指定すると、スローが確認されない場合であってもコンパイラは try ブロックの最適化を積極的に行わないため、イメージのパフォーマンスが低くなります。
throw 以外の方法で発生する例外をキャッチする場合は、/EHa を使用します。次の例では例外が生成されます。
// compiler_options_EHA.cpp
// compile with: /EHa
#include <iostream>
#include <excpt.h>
using namespace std;
void fail() { // generates SE and attempts to catch it using catch(...)
try {
int i = 0, j = 1;
j /= i; // This will throw a SE (divide by zero).
printf("%d", j);
}
catch(...) { // catch block will only be executed under /EHa
cout<<"Caught an exception in catch(...)."<<endl;
}
}
int main() {
__try {
fail();
}
// __except will only catch an exception here
__except(EXCEPTION_EXECUTE_HANDLER) {
// if the exception was not caught by the catch(...) inside fail()
cout << "An exception was caught in __except." << endl;
}
}
/EHc オプションでは、/EHs または /EHa を指定する必要があります。/clr (共通言語ランタイムのコンパイル) を使用すると、/EHa が暗黙に指定されます (/clr /EHa とすると重複になります)。/EHs[c] が /clr の後で使用されると、コンパイラはエラーを生成します。最適化処理は、この動作に影響しません。例外がキャッチされると、例外オブジェクトまたは例外と同じスコープ内にあるオブジェクトに対して、コンパイラが 1 つまたは複数のクラス デストラクターを呼び出します。例外がキャッチされない場合は、これらのデストラクターは実行されません。
/clr を指定する場合の例外処理の制約については、「_set_se_translator」を参照してください。
オプションは、マイナス記号 (-) でクリアできます。たとえば、/EHsc- は /EHs /EHc- と解釈され、/EHs と等価です。
詳細については、「Synchronous Exception Handling」を参照してください。
Visual Studio 開発環境でこのコンパイラ オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。詳細については、「方法 : プロジェクト プロパティ ページを開く」を参照してください。
[C/C++] フォルダーをクリックします。
[コード生成] プロパティ ページをクリックします。
[C++ の例外を有効にする] プロパティを変更します。
または、次のプロシージャを使用できます。
Visual Studio 開発環境でこのコンパイラ オプションを設定するには
[C/C++] フォルダーをクリックします。
[コード生成] プロパティ ページをクリックします。
[C++ の例外を有効にする] を [いいえ] に設定します。
[コマンド ライン] プロパティ ページをクリックします。
[追加のオプション]ボックスにコンパイラ オプションを入力します。
このコンパイラ オプションをコードから設定するには
- ExceptionHandling を参照してください。