Sobes.tech
Middle

Čime se čuvaju izuzeci u C++?

sobes.tech АИ

Одговор од АИ

С објектима. Kada се изузетак баци помоћу throw, креира се привремени објекат који се затим прослеђује механизму за руковање изузецима. Тип тог објекта одређује који catch handler ће бити изабран.

Ево примера који показује како се изузеци чувају у облику објеката:

#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;
}