Sobes.tech
Middle

Czym są przechowywane wyjątki w C++?

sobes.tech AI

Odpowiedź od AI

Z obiektami. Podczas rzucania wyjątku za pomocą throw tworzony jest tymczasowy obiekt, który następnie jest przekazywany do mechanizmu obsługi wyjątków. Typ tego obiektu decyduje, który obsługiwacz catch zostanie wybrany.

Oto przykład demonstrujący przechowywanie wyjątków w formie obiektów:

#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) {
        // Rzucamy wyjątek - obiekt klasy MyException
        throw MyException(-1);
    }
    if (val == 0) {
        // Rzucamy standardowy wyjątek - obiekt klasy std::runtime_error
        throw std::runtime_error("Wartość nie może być zero.");
    }
    std::cout << "Wartość jest dodatnia: " << val << std::endl;
}

int main() {
    try {
        test_func(-5);
    } catch (const MyException& e) {
        // Przechwytujemy wyjątek według typu obiektu MyException
        std::cerr << "Przechwycono MyException z kodem: " << e.get_code() << std::endl;
    } catch (const std::runtime_error& e) {
        // Przechwytujemy wyjątek według typu obiektu std::runtime_error
        std::cerr << "Przechwycono std::runtime_error: " << e.what() << std::endl;
    } catch (...) {
        // Przechwytujemy dowolny inny wyjątek
        std::cerr << "Przechwycono nieznany wyjątek." << std::endl;
    }

    try {
        test_func(0);
    } catch (const std::exception& e) {
        // Można przechwycić klasę bazową dla standardowych wyjątków
        std::cerr << "Przechwycono wyjątek standardowy: " << e.what() << std::endl;
    }

    return 0;
}