Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Information :
catch(...)la sémantique a changé depuis Visual C++ 7.1 ; les exceptions structurées (SEH) ne sont plus interceptées
Notes
C4571 est généré pour chaque catch(...) bloc lorsque vous spécifiez l’option du /EHs compilateur.
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
/EHasi 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 (__tryet__except__finally). Mais n’oubliez pas que, lorsqu’ils sont compilés à l’aide/EHsde , 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,__exceptet__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
}