编译器警告(等级 1)C4297

“function”: 假定函数不引发异常,但确实发生了异常

函数声明包含(可能是隐式的)noexcept 说明符、空的 throw 异常说明符或 __declspec(nothrow) 特性,并且定义包含一个或多个 throw 语句。 若要解决 C4297,请不要尝试在声明了 __declspec(nothrow)noexcept(true)throw() 的函数中引发异常。 或者,删除 noexceptthrow()__declspec(nothrow) 规范。

默认情况下,编译器为用户定义的析构函数和释放函数以及编译器生成的特殊成员函数生成隐式 noexcept(true) 说明符。 这符合 ISO C++ 11 标准。 若要防止生成隐式 noexcept 说明符并将编译器还原到 Visual Studio 2013 的非标准行为,请使用 /Zc:implicitNoexcept- 编译器选项。 有关详细信息,请参阅 /Zc:implicitNoexcept(隐式异常说明符)

有关异常规范的详细信息,请参阅异常规范 (throw)。 此外,有关如何在编译时修改异常处理行为的信息,请参阅 /EH(异常处理模型)

还会为标记为 extern“C”的 __declspec(dllexport) 函数生成此警告,即使它们是 C++ 函数。

下面的示例生成 C4297:

// C4297.cpp
// compile with: /W1 /LD
void __declspec(nothrow) f1()   // declared nothrow
// try the following line instead
// void f1()
{
   throw 1;   // C4297
}