Compiler Warning (level 1) C4297

 

The latest version of this topic can be found at Compiler Warning (level 1) C4297.

function' : function assumed not to throw an exception but does

A function declaration contains a (possibly implicit) noexcept specifier, an empty throw exception specifier, or a __declspec(nothrow) attribute, and the definition contains one or more throw statements. To resolve C4297, do not attempt to throw exceptions in functions that are declared __declspec(nothrow), noexcept(true) or throw(). Alternatively, remove the noexcept, throw(), or __declspec(nothrow) specification.

By default, the compiler generates implicit noexcept(true) specifiers for user-defined destructors and deallocator functions and compiler-generated special member functions. This conforms to the ISO C++11 standard. To prevent generation of implicit noexcept specifiers and revert the compiler to the non-standard behavior of Visual Studio 2013, use the /Zc:implicitNoexcept- compiler option. For more information, see /Zc:implicitNoexcept (Implicit Exception Specifiers).

For more information on exception specifications, see Exception Specifications (throw). Also, see /EH (Exception Handling Model) for information on how to modify exception handling behavior at compile time.

This warning is also generated for __declspec(dllexport) functions marked extern "C", even if they are C++ functions.

The following sample generates C4297:

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