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