Sobes.tech
Middle

Čím sa ukladajú výnimky v C++?

sobes.tech AI

Odpoveď od AI

S objektmi. Pri vyvolaní výnimky pomocou throw sa vytvorí dočasný objekt, ktorý sa následne odovzdá mechanizmu spracovania výnimiek. Typ tohto objektu určuje, ktorý catch handler bude vybraný.

Tu je príklad, ktorý ukazuje, ako sa výnimky ukladajú vo forme objektov:

#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) {
        // Vyhodíme výnimku - objekt triedy MyException
        throw MyException(-1);
    }
    if (val == 0) {
        // Vyhodíme štandardnú výnimku - objekt triedy std::runtime_error
        throw std::runtime_error("Hodnota nemôže byť nula.");
    }
    std::cout << "Hodnota je kladná: " << val << std::endl;
}

int main() {
    try {
        test_func(-5);
    } catch (const MyException& e) {
        // Zachytávame výnimku podľa typu objektu MyException
        std::cerr << "MyException zachytená s kódom: " << e.get_code() << std::endl;
    } catch (const std::runtime_error& e) {
        // Zachytávame výnimku podľa typu objektu std::runtime_error
        std::cerr << "std::runtime_error zachytená: " << e.what() << std::endl;
    } catch (...) {
        // Zachytávame akúkoľvek inú výnimku
        std::cerr << "Neznáma výnimka zachytená." << std::endl;
    }

    try {
        test_func(0);
    } catch (const std::exception& e) {
        // Môžeme zachytiť základnú triedu pre štandardné výnimky
        std::cerr << "Štandardná výnimka zachytená: " << e.what() << std::endl;
    }

    return 0;
}