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

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

/EHs コンパイラ オプションを指定すると、すべての catch(...) ブロックに対して C4571 が生成されます。

解説

/EHs コンパイラ オプションを指定すると、catch(...) ブロックは構造化例外をキャッチしません (たとえば、0 で除算するか、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
}