コンパイラの警告 (レベル 4) C4571
情報:
catch(...)
の意味が Visual C++ 7.1 から変更されています。構造化例外 (SEH) はキャッチされなくなりました
/EHs
コンパイラ オプションを指定すると、すべての catch(...)
ブロックに対して C4571 が生成されます。
解説
/EHs
コンパイラ オプションを指定すると、catch(...)
ブロックは構造化例外をキャッチしません (ゼロ除算、Null ポインター例外など)。catch(...)
ブロックは、明示的にスローされた C++ 例外のみをキャッチします。 詳細については、「例外処理」を参照してください。
既定では、この警告はオフに設定されています。 /EHs
でコンパイルするときに catch (...)
ブロックが構造化例外をキャッチしないようにするには、この警告を有効にします。 詳細については、「既定で無効になっているコンパイラ警告」を参照してください。
C4571 は、次のいずれかの方法で解決できます。
引き続き
catch(...)
ブロックで構造化例外をキャッチする場合は、/EHa
でコンパイルします。catch(...)
ブロックで構造化例外をキャッチしないが、引き続きcatch(...)
ブロックを使用する場合は、C4571 を有効にしないでください。 構造化例外処理キーワード (__try
、__except
、__finally
) を使用して、引き続き構造化例外をキャッチできます。 ただし、/EHs
を使用してコンパイルする場合、デストラクターは C++ 例外がスローされたときにしか呼び出されず、SEH 例外が発生しても呼び出されないことに注意してください。特定の C++ 例外に関して
catch(...)
ブロックを catch ブロックに置き換え、必要に応じて、C++ 例外処理 (__try
、__except
、__finally
) の周囲に構造化例外処理を追加します。 詳細については、「構造化例外処理 (C/C++)」および「/EH
(例外処理モデル)」を参照してください。
例
次の例では C4571 が生成されます。
// C4571.cpp
// compile with: /EHs /W4 /c
#pragma warning(default : 4571)
int main() {
try {
int i = 0, j = 1;
j /= i; // this will throw a SE (divide by zero)
}
catch(...) {} // C4571 warning
}