Sobes.tech
Junior

Qu'est-ce que les exceptions en C++?

sobes.tech IA

Réponse de l'IA

Mécanisme de gestion des situations anormales (erreurs) survenant lors de l'exécution du programme. Permet de séparer le code responsable de la logique du programme du code de gestion des erreurs.

Mots-clés:

  • try: Définit un bloc de code où des exceptions peuvent se produire.
  • catch: Définit un bloc de code qui s'exécute lorsqu'un type spécifique d'exception se produit.
  • throw: Génère (crée) une exception. Le type d'exception peut être n'importe quel objet.

Principe de fonctionnement:

  1. Le code susceptible de provoquer une erreur est placé dans le bloc try.
  2. Si une exception se produit dans le bloc try (générée par throw), l'exécution normale du programme est interrompue.
  3. Le système recherche un bloc catch approprié capable de gérer l'exception générée (par type).
  4. Si un catch correspondant est trouvé, son code est exécuté.
  5. Si aucun catch approprié n'est trouvé au niveau actuel d'appels, l'exception "se propage" vers le haut de la pile d'appels jusqu'à ce qu'une fonction de gestion appropriée soit trouvée (ou que le programme se termine de manière incorrecte).

Exemple:

#include <iostream>
#include <stdexcept> // Pour les types d'exceptions standard

int divide(int a, int b) {
    if (b == 0) {
        throw std::runtime_error("Division par zéro!"); // Génère une exception
    }
    return a / b;
}

int main() {
    try {
        int result = divide(10, 0); // Appelle une fonction qui peut lancer une exception
        std::cout << "Résultat: " << result << std::endl; // Cette ligne ne sera pas exécutée
    } catch (const std::runtime_error& e) { // Capture l'exception de type std::runtime_error
        std::cerr << "Erreur: " << e.what() << std::endl; // Traite l'exception
    } catch (...) { // Capture toute autre exception (points de suspension)
        std::cerr << "Une erreur inconnue est survenue." << std::endl;
    }

    std::cout << "Le programme continue après la gestion de l'erreur." << std::endl;
    return 0;
}

Avantages:

  • Séparation de la logique et de la gestion des erreurs.
  • Simplification du flux principal du code.
  • Capacité de gérer les erreurs à différents niveaux de la hiérarchie d'appels.

Inconvénients:

  • Peut affecter la performance (en raison de la propagation de la pile).
  • Difficulté à comprendre le flux d'exécution en présence de multiples exceptions.
  • Une mauvaise utilisation peut entraîner des fuites de ressources (si les ressources ne sont pas libérées lors d'une exception avant leur libération correcte).

Pour travailler en toute sécurité avec des ressources en présence d'exceptions, on utilise souvent RAII (Resource Acquisition Is Initialization) et des pointeurs intelligents.