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