Sobes.tech
Middle

Come vengono salvate le eccezioni in C++?

sobes.tech AI

Risposta dell'AI

Con oggetti. Quando si lancia un'eccezione con throw, viene creato un oggetto temporaneo che viene poi passato al meccanismo di gestione delle eccezioni. Il tipo di questo oggetto determina quale gestore catch verrà selezionato.

Ecco un esempio che dimostra come salvare le eccezioni sotto forma di oggetti:

#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) {
        // Lancia un'eccezione - oggetto della classe MyException
        throw MyException(-1);
    }
    if (val == 0) {
        // Lancia un'eccezione standard - oggetto della classe std::runtime_error
        throw std::runtime_error("Il valore non può essere zero.");
    }
    std::cout << "Il valore è positivo: " << val << std::endl;
}

int main() {
    try {
        test_func(-5);
    } catch (const MyException& e) {
        // Cattura l'eccezione per tipo di oggetto MyException
        std::cerr << "MyException catturata con codice: " << e.get_code() << std::endl;
    } catch (const std::runtime_error& e) {
        // Cattura l'eccezione per tipo di oggetto std::runtime_error
        std::cerr << "std::runtime_error catturato: " << e.what() << std::endl;
    } catch (...) {
        // Cattura qualsiasi altra eccezione
        std::cerr << "Eccezione sconosciuta catturata." << std::endl;
    }

    try {
        test_func(0);
    } catch (const std::exception& e) {
        // Si può catturare la classe base per le eccezioni standard
        std::cerr << "Eccezione standard catturata: " << e.what() << std::endl;
    }

    return 0;
}