编译器警告(等级 4)C4571
信息: 自 Visual C++ 7.1 之后,catch(...) 语义发生了变化;不再捕获结构化的异常(SEH)
使用 /EHs 编译时,将针对每个 catch(...) 块生成 C4571。
使用 /EHs 编译时,catch(...) 块将不捕获结构化异常(例如,被零除、null 指针);catch(...) 块仅捕获显式引发的 C++ 异常。 有关更多信息,请参见 异常处理在Visual C++。
默认情况下关闭此警告。 打开此警告可确保在使用 /EHs 编译时,catch (...) 块不会捕获结构化异常。 有关更多信息,请参见默认情况下关闭的编译器警告。
可以通过以下方式之一来解决 C4571,
如果仍希望 catch(...) 块捕获结构化异常,请使用 /EHa 进行编译。
如果不希望 catch(...) 块捕获结构化异常,但是仍希望使用 catch(...) 块,请不要启用 C4571。 仍然可以使用结构化异常处理关键字(__try、__except 和 __finally)来捕获结构化异常。 但要记住,在使用 /EHs 编译时,只有在引发 C++ 异常而不是发生 SEH 异常时才调用析构函数。
用特定 C++ 异常的 catch 块代替 catch(...) 块,并可以选择在 C++ 异常处理处添加结构化异常处理(__try、__except 和 __finally)。 有关更多信息,请参见 结构化异常处理(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
}