编译器警告(等级 4)C4571

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

当你指定 /EHs 编译器选项时,会为每个 catch(...) 程序块生成 C4571。

备注

当你指定 /EHs 编译器选项时,catch(...) 程序块不会捕获结构化异常。 (例如,除以零或空指针异常)catch(...) 程序块仅捕获显式引发的 C++ 异常。 有关详细信息,请参阅异常处理

默认情况下,此警告处于关闭状态。 启用此警告可确保在使用 /EHs 进行编译时,catch (...) 程序块不会捕获结构化异常。 有关详细信息,请参阅默认关闭的编译器警告

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

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

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

  • catch(...) 程序块替换为特定 C++ 异常的 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
}