Exceptions et Gestion des Erreurs en C++

Exceptions et Gestion des Erreurs en C++

Amine Abidi - Lead Software Engineer C++/Qt - Associé PointerLab

Publié par Amine Abidi - Lead Software Engineer C++/Qt - Associé PointerLab

Introduction

La gestion des erreurs facilite le débogage et la maintenabilité du code source. En développement, les exceptions permettent de capturer et de traiter les erreurs de manière structurée. Grâce aux blocs try, catch et throw, vous pouvez isoler les erreurs et empêcher votre programme de planter de manière inattendue. Cet article couvre les bases des exceptions en C++, la création d'exceptions personnalisées et les bonnes pratiques pour sécuriser votre code.


1. Utilisation des blocs try, catch et throw

Principe de fonctionnement :

  • try : Enclenche une section de code où des exceptions peuvent se produire.
  • throw : Lance une exception si une erreur est détectée.
  • catch : Capture et traite une exception lancée dans le bloc try.

Exemple simple :

#include <iostream>
using namespace std;

int division(int a, int b) {
    if (b == 0) {
        throw runtime_error("Division par zéro !");
    }
    return a / b;
}

int main() {
    try {
        cout << "Résultat : " << division(10, 2) << endl;  // Pas d'erreur
        cout << "Résultat : " << division(10, 0) << endl;  // Provoque une exception
    } catch (const runtime_error &e) {
        cerr << "Erreur : " << e.what() << endl;  // Affiche "Erreur : Division par zéro !"
    }

    cout << "Fin du programme." << endl;
    return 0;
}

Points clés :

  • Les exceptions interrompent l'exécution normale et transfèrent le contrôle au bloc catch.
  • La classe std::runtime_error (issue de la bibliothèque standard) est utilisée pour signaler les erreurs.
  • e.what() permet d'obtenir un message explicatif sur l'erreur.

3. Stratégies pour sécuriser le code face aux erreurs

  1. Anticiper les erreurs courantes :

    • Valider les entrées utilisateur (ex. : éviter les divisions par zéro).
    • Vérifier les ressources externes (ex. : ouverture de fichiers, allocations mémoire).
  2. Toujours capturer les exceptions :

    • Utilisez des blocs try-catch pour entourer le code susceptible de provoquer des erreurs.
    • Prévoyez un catch (...) pour attraper les erreurs inattendues.
try {
    // Code susceptible de provoquer une erreur
} catch (...) {
    cerr << "Une exception inattendue a été attrapée !" << endl;
}
  1. Nettoyer les ressources après une exception :

    • Libérez la mémoire ou fermez les fichiers dans un bloc catch.
    • Utilisez des RAII (Resource Acquisition Is Initialization) pour gérer automatiquement les ressources.
  2. N'abusez pas des exceptions :

    • Utilisez les exceptions pour des erreurs exceptionnelles, pas pour le flux normal du programme.
    • Préférez les retours de statut (bool, int, std::optional) pour des erreurs mineures.

4. Exercice pratique

Énoncé :

  1. Implémentez une fonction qui ouvre un fichier et lance une exception si le fichier est introuvable.
  2. Créez une exception personnalisée pour signaler une erreur de format dans le contenu du fichier.
  3. Testez ces exceptions avec un fichier d'exemple.

Conclusion

Les exceptions en C++ permettent de capturer et de traiter les erreurs grâce aux blocs try, catch et throw. Elles sont utiles pour isoler les erreurs, signaler des problèmes inattendus et gérer des cas particuliers via des exceptions personnalisées.

Utilisez les exceptions pour gérer des situations exceptionnelles et privilégiez des retours de statut pour les erreurs mineures.


À propos de pointerlab

pointerlab s’inspire des fonctions lambda en C++, symbole de code concis, flexible et performant. C’est cette philosophie, mêlant rigueur et modernité, que nous mettons au service des défis de nos clients.

Spécialiste logiciels multiplateformes avec C++/Qt

Nos experts sont votre atout pour livrer en toute fiabilité vos projets logiciels, qu'il s'agisse de développement multiplateforme, d'applications embarquées, de solutions 3D/OpenGL, ou encore de vision par ordinateur.

Découvrez nos expertises :

Les secteurs où nous intervenons :

Nous accompagnons des industries exigeantes pour répondre à leurs défis technologiques :

Pour chaque projet, notre expertise garantit des solutions innovantes et adaptées à vos besoins.

Rejoignez la communauté C++ France sur Discord !

Développez votre réseau et boostez votre carrière avec la communauté C++ France