Sobes.tech
Junior

Ի՞նչ են C++-ում արտակարգ իրավիճակները։

sobes.tech AI

Պատասխան AI-ից

Մեխանիզմ՝ անոմալ իրավիճակների (գործողությունների սխալների) մշակման համար, որոնք առաջանում են ծրագրի կատարման ժամանակ: Հնարավորություն է տալիս բաժանել ծրագրի տրամաբանության կոդը սխալների մշակման կոդից:

Բանալի բառեր:

  • try: Դիտում է կոդի բլոկ, որտեղ կարող են առաջանալ արտառոց իրավիճակներ:
  • catch: Դիտում է կոդի բլոկ, որը կատարվում է որոշակի արտառոց իրավիճակի առաջացման դեպքում:
  • throw: Ստեղծում է արտառոց իրավիճակ (արտահանում): Արտառոց իրավիճակի տեսակն կարող է լինել ցանկացած օբյեկտ:

Աշխատանքի սկզբունքը:

  1. Կոդը, որը կարող է սխալ առաջացնել, տեղադրվում է try բլոկում:
  2. Եթե try բլոկում առաջանում է արտառոց իրավիճակ (օգտագործելով throw), ծրագրի սովորական կատարմանը խանգարում է:
  3. Համակարգը որոնում է համապատասխան catch բլոկ, որը կարող է մշակել առաջացած արտառոց իրավիճակը (տիպով):
  4. Եթե գտնվի համապատասխան catch, նրա կոդը կատարվում է:
  5. Եթե համապատասխան 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) և խելացի ցուցիչներ։