编译器警告(等级 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
}