Junior
Ի՞նչ են C++-ում արտակարգ իրավիճակները։
sobes.tech AI
Պատասխան AI-ից
Մեխանիզմ՝ անոմալ իրավիճակների (գործողությունների սխալների) մշակման համար, որոնք առաջանում են ծրագրի կատարման ժամանակ: Հնարավորություն է տալիս բաժանել ծրագրի տրամաբանության կոդը սխալների մշակման կոդից:
Բանալի բառեր:
try: Դիտում է կոդի բլոկ, որտեղ կարող են առաջանալ արտառոց իրավիճակներ:catch: Դիտում է կոդի բլոկ, որը կատարվում է որոշակի արտառոց իրավիճակի առաջացման դեպքում:throw: Ստեղծում է արտառոց իրավիճակ (արտահանում): Արտառոց իրավիճակի տեսակն կարող է լինել ցանկացած օբյեկտ:
Աշխատանքի սկզբունքը:
- Կոդը, որը կարող է սխալ առաջացնել, տեղադրվում է
tryբլոկում: - Եթե
tryբլոկում առաջանում է արտառոց իրավիճակ (օգտագործելովthrow), ծրագրի սովորական կատարմանը խանգարում է: - Համակարգը որոնում է համապատասխան
catchբլոկ, որը կարող է մշակել առաջացած արտառոց իրավիճակը (տիպով): - Եթե գտնվի համապատասխան
catch, նրա կոդը կատարվում է: - Եթե համապատասխան
catchչի գտնվել ընթացիկ կանչի մակարդակում, արտառոց իրավիճակը «տարածվում» է վերև՝ կանչերի բլոկի վրա, մինչև գտնվի համապատասխան մշակող ֆունկցիա (կամ ծրագիրը սխալ կերպով ավարտվի):
Օրինակ:
#include <iostream>
#include <stdexcept> // Ստանդարտ արտառոց իրավիճակների համար
int divide(int a, int b) {
if (b == 0) {
throw std::runtime_error("Division by zero!"); // Ստեղծում ենք արտառոց իրավիճակ
}
return a / b;
}
int main() {
try {
int result = divide(10, 0); // Զանգում ենք ֆունկցիա, որը կարող է արտահանել արտառոց իրավիճակ
std::cout << "Result: " << result << std::endl; // Այս տողը չի կատարվի
} catch (const std::runtime_error& e) { // Լավում ենք `std::runtime_error` տիպի արտառոց իրավիճակ
std::cerr << "Error: " << e.what() << std::endl; // Մշակում ենք արտառոց իրավիճակը
} catch (...) { // Լավում ենք ցանկացած այլ արտառոց իրավիճակ
std::cerr << "An unknown error occurred." << std::endl;
}
std::cout << "Program continues after error handling." << std::endl;
return 0;
}
Առավելություններ:
- Լոգիկայի և սխալների մշակման բաժանում:
- Հեշտացնում է հիմնական կատարման հոսքը:
- Հնարավորություն է տալիս մշակել սխալները տարբեր մակարդակներում:
Անբարենպաստություններ:
- Կարող է ազդել կատարողականության վրա (ստորին մասում ստեկի բացումից հետո):
- Կատարման հոսքի բարդացում՝ երբ շատ արտառոց իրավիճակներ կան:
- Չարաշահումը կարող է հանգեցնել ռեսուրսների արտահոսքի (եթե ռեսուրսները չեն ազատվում արտառոց իրավիճակի առաջացման դեպքում մինչև ճիշտ ազատում):
Անվտանգ ռեսուրսների աշխատանքի համար, երբ կան արտառոց իրավիճակներ, հաճախ օգտագործվում են RAII (Resource Acquisition Is Initialization) և խելացի ցուցիչներ։