Sobes.tech
Junior

Kas ir izņēmumi C++?

sobes.tech AI

Atbilde no AI

Mehānisms, kas paredzēts novērot anomālas situācijas (kļūdas), kas rodas programmas izpildes laikā. Tas ļauj atdalīt koda daļu, kas atbild par programmas loģiku, no kļūdu apstrādes koda.

Galvenie vārdi:

  • try: Nosaka koda bloku, kurā var rasties izņēmumi.
  • catch: Nosaka koda bloku, kas tiek izpildīts, ja rodas noteikts izņēmuma tips.
  • throw: Ģenerē (izveido) izņēmumu. Izņēmuma tips var būt jebkurš objekts.

Darba princips:

  1. Kods, kas var izraisīt kļūdu, tiek ievietots try blokā.
  2. Ja try blokā rodas izņēmums (izmantojot throw), parastais programmas izpildes process tiek pārtraukts.
  3. Sistēma meklē piemērotu catch bloku, kas spēj apstrādāt radīto izņēmumu (atbilstoši tipam).
  4. Ja tiek atrasts atbilstošs catch, tā kods tiek izpildīts.
  5. Ja nav atrasts piemērots catch līmenī, izņēmums "izplatās" uz augšu pa izsaukumu steku, līdz tiek atrasta piemērota apstrādes funkcija (vai programma nepareizi beidzas).

Piemērs:

#include <iostream>
#include <stdexcept> // Standarta izņēmumu tipi

int divide(int a, int b) {
    if (b == 0) {
        throw std::runtime_error("Division by zero!"); // Izveidojam izņēmumu
    }
    return a / b;
}

int main() {
    try {
        int result = divide(10, 0); // Izsaucam funkciju, kas var izraisīt izņēmumu
        std::cout << "Result: " << result << std::endl; // Šī rinda netiks izpildīta
    } catch (const std::runtime_error& e) { // Notveram `std::runtime_error` tipu izņēmumu
        std::cerr << "Error: " << e.what() << std::endl; // Apstrādājam izņēmumu
    } catch (...) { // Notveram jebkuru citu izņēmumu
        std::cerr << "An unknown error occurred." << std::endl;
    }

    std::cout << "Program continues after error handling." << std::endl;
    return 0;
}

Priekšrocības:

  • Loģikas un kļūdu apstrādes atdalīšana.
  • Galvenā izpildes plūsmas vienkāršošana.
  • Kļūdu apstrādes iespēja dažādos izsaukumu līmeņos.

Trūkumi:

  • Var ietekmēt veiktspēju (steķa izplešanās dēļ).
  • Plūsmas saprašana kļūst sarežģītāka, ja ir daudz izņēmumu.
  • Nepareiza lietošana var novest pie resursu noplūdes (ja resursi netiek atbrīvoti, pirms tie tiek pareizi atbrīvoti pēc izņēmuma).

Lai nodrošinātu drošu darbu ar resursiem, ja ir izņēmumi, bieži izmanto RAII (Resource Acquisition Is Initialization) un gudrus rādītājus.