Sobes.tech
Middle

Como são guardadas as exceções em C++?

sobes.tech IA

Resposta da IA

Com objetos. Ao lançar uma exceção com throw, um objeto temporário é criado, que é então passado para o mecanismo de tratamento de exceções. O tipo deste objeto determina qual manipulador catch será selecionado.

Aqui está um exemplo que demonstra como guardar exceções na 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) {
        // Lançamos uma exceção - objeto da classe MyException
        throw MyException(-1);
    }
    if (val == 0) {
        // Lançamos uma exceção padrão - objeto da classe std::runtime_error
        throw std::runtime_error("O valor não pode ser zero.");
    }
    std::cout << "O valor é positivo: " << val << std::endl;
}

int main() {
    try {
        test_func(-5);
    } catch (const MyException& e) {
        // Capturamos a exceção pelo tipo de objeto MyException
        std::cerr << "MyException capturada com o código: " << e.get_code() << std::endl;
    } catch (const std::runtime_error& e) {
        // Capturamos a exceção pelo tipo de objeto std::runtime_error
        std::cerr << "std::runtime_error capturado: " << e.what() << std::endl;
    } catch (...) {
        // Capturamos qualquer outra exceção
        std::cerr << "Exceção desconhecida capturada." << std::endl;
    }

    try {
        test_func(0);
    } catch (const std::exception& e) {
        // Pode-se capturar a classe base para exceções padrão
        std::cerr << "Exceção padrão capturada: " << e.what() << std::endl;
    }

    return 0;
}