Sobes.tech
Middle

¿Con qué se guardan las excepciones en C++?

sobes.tech AI

Respuesta de la IA

Con objetos. Al lanzar una excepción con throw, se crea un objeto temporal que luego se pasa al mecanismo de manejo de excepciones. El tipo de este objeto determina qué manejador catch será seleccionado.

Aquí hay un ejemplo que demuestra cómo guardar excepciones en forma de objetos:

#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) {
        // Lanzamos una excepción - objeto de la clase MyException
        throw MyException(-1);
    }
    if (val == 0) {
        // Lanzamos una excepción estándar - objeto de la clase std::runtime_error
        throw std::runtime_error("El valor no puede ser cero.");
    }
    std::cout << "El valor es positivo: " << val << std::endl;
}

int main() {
    try {
        test_func(-5);
    } catch (const MyException& e) {
        // Capturamos la excepción por tipo de objeto MyException
        std::cerr << "Capturada MyException con código: " << e.get_code() << std::endl;
    } catch (const std::runtime_error& e) {
        // Capturamos la excepción por tipo de objeto std::runtime_error
        std::cerr << "Capturada std::runtime_error: " << e.what() << std::endl;
    } catch (...) {
        // Capturamos cualquier otra excepción
        std::cerr << "Excepción desconocida capturada." << std::endl;
    }

    try {
        test_func(0);
    } catch (const std::exception& e) {
        // Se puede capturar la clase base para excepciones estándar
        std::cerr << "Excepción estándar capturada: " << e.what() << std::endl;
    }

    return 0;
}