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