Sobes.tech
Middle

Čím jsou v C++ ukládány výjimky?

sobes.tech AI

Odpověď od AI

S objekty. Při vyhození výjimky pomocí throw je vytvořen dočasný objekt, který je poté předán mechanismu zpracování výjimek. Typ tohoto objektu určuje, který catch handler bude vybrán.

Zde je příklad, který ukazuje, jak ukládat výjimky ve formě objektů:

#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) {
        // Vyhození výjimky - objekt třídy MyException
        throw MyException(-1);
    }
    if (val == 0) {
        // Vyhození standardní výjimky - objekt třídy std::runtime_error
        throw std::runtime_error("Hodnota nesmí být nula.");
    }
    std::cout << "Hodnota je kladná: " << val << std::endl;
}

int main() {
    try {
        test_func(-5);
    } catch (const MyException& e) {
        // Zachycení výjimky podle typu objektu MyException
        std::cerr << "MyException zachycena s kódem: " << e.get_code() << std::endl;
    } catch (const std::runtime_error& e) {
        // Zachycení výjimky podle typu objektu std::runtime_error
        std::cerr << "std::runtime_error zachycen: " << e.what() << std::endl;
    } catch (...) {
        // Zachycení jakékoli jiné výjimky
        std::cerr << "Neznámá výjimka zachycena." << std::endl;
    }

    try {
        test_func(0);
    } catch (const std::exception& e) {
        // Může být zachycena základní třída pro standardní výjimky
        std::cerr << "Standardní výjimka zachycena: " << e.what() << std::endl;
    }

    return 0;
}