Sobes.tech
Middle

Hogyan tárolódnak a kivételek C++-ban?

sobes.tech MI

Válasz az MI-től

Objektumokkal. Amikor throw segítségével kivételt dobunk, létrejön egy ideiglenes objektum, amelyet ezután a kivételkezelő mechanizmushoz továbbítanak. Ennek az objektumnak a típusa határozza meg, hogy melyik catch kezelő lesz kiválasztva.

Íme egy példa arra, hogyan tárolhatók a kivételek objektumként:

#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) {
        // Kivétel dobása - a MyException osztály példánya
        throw MyException(-1);
    }
    if (val == 0) {
        // Szabványos kivétel dobása - a std::runtime_error osztály példánya
        throw std::runtime_error("Az érték nem lehet nulla.");
    }
    std::cout << "Az érték pozitív: " << val << std::endl;
}

int main() {
    try {
        test_func(-5);
    } catch (const MyException& e) {
        // A kivétel elkapása a MyException típus szerint
        std::cerr << "MyException elkapva, kód: " << e.get_code() << std::endl;
    } catch (const std::runtime_error& e) {
        // A kivétel elkapása a std::runtime_error típus szerint
        std::cerr << "std::runtime_error elkapva: " << e.what() << std::endl;
    } catch (...) {
        // Bármilyen más kivétel elkapása
        std::cerr << "Ismeretlen kivétel elkapva." << std::endl;
    }

    try {
        test_func(0);
    } catch (const std::exception& e) {
        // Az alap osztály elkapása a standard kivételekhez
        std::cerr << "Standard kivétel elkapva: " << e.what() << std::endl;
    }

    return 0;
}