Partilhar via


Aviso do compilador (nível 1) C4297

'function': a função não deveria gerar uma exceção, mas gera

Uma declaração de função contém um especificador noexcept (possivelmente implícito), um especificador de exceção vazio throw ou um atributo __declspec(nothrow), e a definição contém uma ou mais instruções throw. Para resolver o C4297, não tente lançar exceções em funções declaradas __declspec(nothrow), noexcept(true) ou throw(). Como alternativa, remova a especificação noexcept, throw() ou __declspec(nothrow).

Por padrão, o compilador gera especificadores implícitos noexcept(true) para destruidores definidos pelo usuário e funções de desalocador e funções de membro especiais geradas pelo compilador. Isso está em conformidade com o padrão ISO C++11. Para evitar a geração de especificadores de noexcept implícitos e reverter o compilador para o comportamento não padrão do Visual Studio 2013, use a opção do compilador /Zc:implicitNoexcept. Para obter mais informações, consulte /Zc:implicitNoexcept (Especificadores de exceção implícita).

Para obter mais informações sobre as especificações de exceção, confira Especificações de exceção (throw). Além disso, consulte /EH (Modelo de tratamento de exceções) para obter informações sobre como modificar o comportamento de tratamento de exceções no tempo de compilação.

Esse aviso também é gerado para funções __declspec(dllexport) marcadas como "C" extern, mesmo que sejam funções C++.

O seguinte exemplo gera o erro C4297:

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