Compartir a través de


Advertencia del compilador (nivel 1) C4297

'función': se suponía que la función no iniciaba una excepción, pero lo hace

Una declaración de función contiene un especificador noexcept (posiblemente implícito), un especificador de excepción throw vacío o un atributo __declspec(nothrow), y la definición contiene una o más instrucciones throw. Para resolver la advertencia C4297, no intente iniciar excepciones en funciones declaradas __declspec(nothrow), noexcept(true) o throw(). O bien, quite la especificación noexcept, throw() o __declspec(nothrow).

De manera predeterminada, el compilador genera especificadores noexcept(true) implícitos para destructores definidos por el usuario, funciones de desasignador y funciones miembro especiales generadas por el compilador. Esto cumple la norma ISO C ++ 11. Para evitar la generación de especificadores noexcept implícitos y revertir el compilador al comportamiento no estándar de Visual Studio 2013, use la opción del compilador /Zc:implicitNoexcept-. Para más información, consulte /Zc:implicitNoexcept (especificadores de excepción implícita).

Para más información sobre las especificaciones de excepciones, consulte Especificaciones de excepciones (throw). Consulte también /EH (Modelo de control de excepciones) para información sobre cómo modificar el comportamiento de control de excepciones en tiempo de compilación.

Esta advertencia también se genera para funciones __declspec(dllexport) marcadas como extern "C", incluso si son funciones de C++.

El siguiente ejemplo genera la advertencia C4297.

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