Sobes.tech
Middle

Comment les exceptions sont-elles sauvegardées en C++?

sobes.tech IA

Réponse de l'IA

Avec des objets. Lorsqu'une exception est levée avec throw, un objet temporaire est créé, puis transmis au mécanisme de gestion des exceptions. Le type de cet objet détermine le gestionnaire catch qui sera choisi.

Voici un exemple illustrant la sauvegarde des exceptions sous forme d'objets :

#include <iostream>
#include <stdexcept>

class MyException {
    int error_code;
public:
    MyException(int code) : error_code(code) {}
    int get_code() const { return error_code; }
};

void test_func(int val) {
    if (val < 0) {
        // Lancer une exception - objet de la classe MyException
        throw MyException(-1);
    }
    if (val == 0) {
        // Lancer une exception standard - objet de la classe std::runtime_error
        throw std::runtime_error("La valeur ne peut pas être zéro.");
    }
    std::cout << "La valeur est positive : " << val << std::endl;
}

int main() {
    try {
        test_func(-5);
    } catch (const MyException& e) {
        // Attraper l'exception par le type de l'objet MyException
        std::cerr << "MyException attrapée avec le code : " << e.get_code() << std::endl;
    } catch (const std::runtime_error& e) {
        // Attraper l'exception par le type de l'objet std::runtime_error
        std::cerr << "std::runtime_error attrapé : " << e.what() << std::endl;
    } catch (...) {
        // Attraper toute autre exception
        std::cerr << "Exception inconnue attrapée." << std::endl;
    }

    try {
        test_func(0);
    } catch (const std::exception& e) {
        // On peut attraper la classe de base pour les exceptions standard
        std::cerr << "Exception standard attrapée : " << e.what() << std::endl;
    }

    return 0;
}