Sobes.tech
Middle

С какво се съхраняват изключенията в C++?

sobes.tech AI

Отговор от AI

С обекти. Когато се хвърли изключение с throw, се създава временен обект, който след това се предава към механизма за обработка на изключенията. Типът на този обект определя кой catch обработчик ще бъде избран.

Ето пример, който демонстрира как изключенията се съхраняват под формата на обекти:

#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) {
        // Изхвърляме изключение - обект от клас MyException
        throw MyException(-1);
    }
    if (val == 0) {
        // Изхвърляме стандартно изключение - обект от клас std::runtime_error
        throw std::runtime_error("Стойността не може да бъде нула.");
    }
    std::cout << "Стойността е положителна: " << val << std::endl;
}

int main() {
    try {
        test_func(-5);
    } catch (const MyException& e) {
        // Хващаме изключението по тип на обекта MyException
        std::cerr << "Хванаха MyException с код: " << e.get_code() << std::endl;
    } catch (const std::runtime_error& e) {
        // Хващаме изключението по тип на обекта std::runtime_error
        std::cerr << "Хванаха std::runtime_error: " << e.what() << std::endl;
    } catch (...) {
        // Хващаме всяко друго изключение
        std::cerr << "Хванаха непознато изключение." << std::endl;
    }

    try {
        test_func(0);
    } catch (const std::exception& e) {
        // Може да хванем базовия клас за стандартните изключения
        std::cerr << "Стандартно изключение хванато: " << e.what() << std::endl;
    }

    return 0;
}