コンパイラの警告 (レベル 4) C4571

更新 : 2007 年 11 月

エラー メッセージ

情報: catch(...) の意味が Visual C++ 7.1 から変更されています。構造化例外 (SEH) はキャッチされません。

C4571 は /EHs でのコンパイル時にすべての catch(...) ブロックに対して生成されます。

/EHs でのコンパイル時に、catch(...) ブロックは構造化例外 (0 による除算や null ポインタなど) をキャッチしません。catch(...) ブロックは明示的にスローされた C++ 例外だけをキャッチします。詳細については、「Exception Handling in Visual C++」を参照してください。

既定では、この警告はオフに設定されています。/EHs でのコンパイル時に catch (...) ブロックが構造化例外をキャッチしないようにするには、この警告をオンにします。詳細については、「Compiler Warnings That Are Off by Default」を参照してください。

C4571 は、次のいずれかの方法で解決します。

  • catch(...) ブロックで構造化例外をキャッチする場合は、/EHa でコンパイルします。

  • catch(...) ブロックを使用し、ただし構造化例外をキャッチしない場合は、C4571 を有効にしないでください。構造化例外は、構造化例外処理キーワード (__try__except、および __finally) を使用してキャッチできます。ただし、コンパイルされた /EHs デストラクタが呼び出されるのは C++ 例外がスローされたときだけで、SEH 例外の発生時には呼び出されません。

  • catch(...) ブロックを特定の C++ 例外の catch ブロックに置き換え、オプションで C++ 例外処理 (__try__except、および __finally) について構造化例外処理を追加します。詳細については、「Structured Exception Handling (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
}