编译器警告(等级 4)C4571

信息: 自 Visual C++ 7.1 之后,catch(...) 语义发生了变化;不再捕获结构化的异常(SEH)

使用 /EHs 编译时,将针对每个 catch(...) 块生成 C4571。

使用 /EHs 编译时,catch(...) 块将不捕获结构化异常(例如,被零除、null 指针);catch(...) 块仅捕获显式引发的 C++ 异常。 有关更多信息,请参见 Exception Handling in Visual C++

默认情况下关闭此警告。 打开此警告可确保在使用 /EHs 编译时,catch (...) 块不会捕获结构化异常。 有关更多信息,请参见Compiler Warnings That Are Off by Default

可以通过以下方式之一来解决 C4571,

  • 如果仍希望 catch(...) 块捕获结构化异常,请使用 /EHa 进行编译。

  • 如果不希望 catch(...) 块捕获结构化异常,但是仍希望使用 catch(...) 块,请不要启用 C4571。 仍然可以使用结构化异常处理关键字(__try__except__finally)来捕获结构化异常。 但要记住,在使用 /EHs 编译时,只有在引发 C++ 异常而不是发生 SEH 异常时才调用析构函数。

  • 用特定 C++ 异常的 catch 块代替 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
}