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 vos catch(...) 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 utiliser catch(...) des blocs. Vous pouvez toujours intercepter des exceptions structurées à l’aide de la gestion des exceptions structurées mot clé s (__try, __exceptet __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
}