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