Avertissement du compilateur (niveau 4) C4571
Information :
catch(...)
la sémantique a changé depuis Visual C++ 7.1 ; les exceptions structurées (SEH) ne sont plus interceptées
C4571 est généré pour chaque catch(...)
bloc lorsque vous spécifiez l’option du /EHs
compilateur.
Notes
Lorsque vous spécifiez l’option du /EHs
compilateur, catch(...)
les blocs ne interceptent pas les exceptions structurées. (Diviser par zéro ou exceptions de pointeur Null, par exemple.) Un catch(...)
bloc intercepte uniquement les exceptions C++ levées explicitement. Pour plus d’informations, consultez l’article Gestion des exceptions.
Cet avertissement est désactivé par défaut. Activez cet avertissement pour vous assurer que lorsque vous compilez avec /EHs
vos catch (...)
blocs, n’interceptez pas les exceptions structurées. Pour plus d’informations, consultez les avertissements du compilateur désactivés par défaut.
Vous pouvez résoudre C4571 de l’une des manières suivantes :
Compilez avec
/EHa
si vous souhaitez toujours que voscatch(...)
blocs interceptent les exceptions structurées.N’activez pas C4571 si vous ne souhaitez pas que vos
catch(...)
blocs interceptent les exceptions structurées, mais que vous souhaitez toujours utilisercatch(...)
des blocs. Vous pouvez toujours intercepter des exceptions structurées à l’aide des mots clés de gestion des exceptions structurées (__try
et__except
__finally
). Mais n’oubliez pas que, lorsqu’ils sont compilés à l’aide/EHs
de , les destructeurs sont appelés uniquement lorsqu’une exception C++ est levée, et non lorsqu’une exception SEH se produit.Remplacez
catch(...)
les blocs par des blocs catch pour des exceptions C++ spécifiques, et éventuellement, ajoutez une gestion structurée des exceptions autour de la gestion des exceptions C++ (__try
,__except
et__finally
). Pour plus d’informations, consultez Gestion des exceptions structurées (C/C++) et/EH
(Modèle de gestion des exceptions).
Exemple
L’exemple suivant génère l’erreur C4571.
// C4571.cpp
// compile with: /EHs /W4 /c
#pragma warning(default : 4571)
int main() {
try {
int i = 0, j = 1;
j /= i; // this will throw a SE (divide by zero)
}
catch(...) {} // C4571 warning
}