Instructions try, throw et catch (C++)

Pour implémenter la gestion des exceptions en C++, vous utilisez try, throwet catch des expressions.

Tout d’abord, utilisez un try bloc pour placer une ou plusieurs instructions susceptibles de lever une exception.

Une throw expression signale qu’une condition exceptionnelle ( souvent, une erreur) s’est produite dans un try bloc. Vous pouvez utiliser un objet de n’importe quel type comme opérande d’une throw expression. En général, cet objet est utilisé pour transmettre des informations sur l'erreur. Dans la plupart des cas, nous vous recommandons d’utiliser la std::exception classe ou l’une des classes dérivées définies dans la bibliothèque standard. Si l’un de ces éléments n’est pas approprié, nous vous recommandons de dériver votre propre classe d’exception à partir de std::exception.

Pour gérer les exceptions qui peuvent être levées, implémentez un ou plusieurs catch blocs immédiatement après un try bloc. Chaque catch bloc spécifie le type d’exception qu’il peut gérer.

Cet exemple montre un try bloc et ses gestionnaires. Supposons que GetNetworkResource() acquiert des données via une connexion réseau et que les deux types d'exception sont des classes définies par l'utilisateur qui dérivent de std::exception. Notez que les exceptions sont interceptées par const référence dans l’instruction catch . Nous vous recommandons de lever des exceptions par valeur et de les intercepter par référence const.

Exemple

MyData md;
try {
   // Code that could throw an exception
   md = GetNetworkResource();
}
catch (const networkIOException& e) {
   // Code that executes when an exception of type
   // networkIOException is thrown in the try block
   // ...
   // Log error message in the exception object
   cerr << e.what();
}
catch (const myDataFormatException& e) {
   // Code that handles another exception type
   // ...
   cerr << e.what();
}

// The following syntax shows a throw expression
MyData GetNetworkResource()
{
   // ...
   if (IOSuccess == false)
      throw networkIOException("Unable to connect");
   // ...
   if (readError)
      throw myDataFormatException("Format error");
   // ...
}

Notes

Le code après la try clause est la section protégée du code. L’expression throwlève, autrement dit, une exception. Le bloc de code après la catch clause est le gestionnaire d’exceptions. Il s’agit du gestionnaire qui intercepte l’exception levée si les types dans les expressions et catch les throw types sont compatibles. Pour obtenir la liste des règles qui régissent la correspondance de type dans catch les blocs, consultez Comment les blocs Catch sont évalués. Si l’instruction catch spécifie un point de suspension (...) au lieu d’un type, le catch bloc gère chaque type d’exception. Lorsque vous compilez avec l’option /EHa , celles-ci peuvent inclure des exceptions structurées C et des exceptions asynchrones générées par le système ou générées par le système, telles que la protection de la mémoire, la division par zéro et les violations à virgule flottante. Étant donné que catch les blocs sont traités dans l’ordre du programme pour rechercher un type correspondant, un gestionnaire de points de suspension doit être le dernier gestionnaire du bloc associé try . Utilisez catch(...) la prudence ; n’autorisez pas un programme à continuer, sauf si le bloc catch sait comment gérer l’exception spécifique interceptée. En général, un bloc catch(...) est utilisé pour enregistrer des erreurs et effectuer un nettoyage spécial avant l'arrêt de l'exécution du programme.

Expression throw qui n’a pas d’opérande rethrows l’exception en cours de traitement. Nous vous recommandons de renvoyer l’exception, car cela conserve les informations de type polymorphe de l’exception d’origine. Une telle expression ne doit être utilisée que dans un catch gestionnaire ou dans une fonction appelée à partir d’un catch gestionnaire. L’objet exception rethrown est l’objet d’exception d’origine, et non une copie.

try {
   throw CSomeOtherException();
}
catch(...) {
   // Catch all exceptions - dangerous!!!
   // Respond (perhaps only partially) to the exception, then
   // re-throw to pass the exception to some other handler
   // ...
   throw;
}

Voir aussi

Meilleures pratiques C++ modernes pour la gestion des exceptions et des erreurs
Mots clés
Exceptions C++ non gérées
__uncaught_exception