Partager via


Avertissement du compilateur (niveau 1) C4297

'fonction' : la fonction lève une exception alors qu'elle est présumée ne pas le faire

Une déclaration de fonction contient un spécificateur (éventuellement implicite), noexcept un spécificateur d’exception vide throw ou un attribut __declspec(nothrow) et la définition contient une ou plusieurs instructions throw . Pour résoudre l'avertissement C4297, ne tentez pas de lever des exceptions dans les fonctions qui sont déclarées __declspec(nothrow), noexcept(true) ou throw(). Vous pouvez également supprimer la spécification noexcept, throw() ou __declspec(nothrow).

Par défaut, le compilateur génère des spécificateurs noexcept(true) implicites pour les fonctions annulatrices d'allocation et les destructeurs définis par l'utilisateur, ainsi que pour les fonctions membres spéciales générées par le compilateur. Cela est conforme à la norme ISO C++11. Pour empêcher la génération de spécificateurs noexcept implicites et rétablir le comportement non standard de Visual Studio 2013, utilisez l’option du compilateur /Zc :implicitNoexcept- . Pour plus d’informations, consultez /Zc :implicitNoexcept (spécificateurs d’exceptions implicites).

Pour plus d’informations sur les spécifications d’exception, consultez Spécifications d’exception (throw). Consultez également /EH (Modèle de gestion des exceptions) pour plus d’informations sur la modification du comportement de gestion des exceptions au moment de la compilation.

Cet avertissement est également généré pour les fonctions __declspec(dllexport) marquées extern « C », même si elles sont des fonctions C++.

L'exemple suivant génère l'avertissement C4297 :

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