Sobes.tech
Junior

Kas yra išimtys C++?

sobes.tech AI

Atsakymas iš AI

Mechanizmas, skirtas apdoroti anomalines situacijas (klaidas), kurios atsiranda programos vykdymo metu. Leidžia atskirti kodo, atsakingo už programos logiką, dalį nuo klaidų apdorojimo kodo.

Raktiniai žodžiai:

  • try: Nustato kodo bloką, kuriame gali įvykti išimtys.
  • catch: Nustato kodo bloką, kuris vykdomas, kai įvyksta tam tikro tipo išimtis.
  • throw: Generuoja (sukuria) išimtį. Išimties tipas gali būti bet koks objektas.

Veikimo principas:

  1. Kodas, kuris gali sukelti klaidą, dedamas į try bloką.
  2. Jei try bloke įvyksta išimtis (naudojant throw), įprastas programos vykdymas nutraukiamas.
  3. Sistema ieško tinkamo catch bloko, kuris gali apdoroti sugeneruotą išimtį (pagal tipą).
  4. Jei randamas tinkamas catch, jo kodas vykdomas.
  5. Jei tinkamas catch nerandamas dabartiniame iškvietimo lygyje, išimtis "plinta" aukštyn iškvietimų steku, kol bus rasta tinkama apdorojimo funkcija (arba programa netinkamai užbaigiama).

Pavyzdys:

#include <iostream>
#include <stdexcept> // Standartinių išimčių tipams

int divide(int a, int b) {
    if (b == 0) {
        throw std::runtime_error("Division by zero!"); // Sugeneruojame išimtį
    }
    return a / b;
}

int main() {
    try {
        int result = divide(10, 0); // Kvietimas funkcijos, kuri gali išmesti išimtį
        std::cout << "Result: " << result << std::endl; // Ši eilutė nebus vykdoma
    } catch (const std::runtime_error& e) { // Gaudome `std::runtime_error` tipo išimtį
        std::cerr << "Error: " << e.what() << std::endl; // Apdorojame išimtį
    } catch (...) { // Gaudome bet kokią kitą išimtį
        std::cerr << "An unknown error occurred." << std::endl;
    }

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

Privalumai:

  • Logikos ir klaidų apdorojimo atskyrimas.
  • Pagrindinio vykdymo srauto supaprastinimas.
  • Klaidų apdorojimo galimybė skirtinguose iškvietimo hierarchijos lygiuose.

Trūkumai:

  • Gali paveikti našumą (dėl steko išplėtimo).
  • Srauto supratimas tampa sudėtingesnis, kai yra daug išimčių.
  • Netinkamas naudojimas gali sukelti išteklių nutekėjimą (jei ištekliai nėra atlaisvinami prieš jų teisingą atlaisvinimą išimtis įvykus).

Siekiant saugaus darbo su ištekliais, kai yra išimčių, dažnai naudojami RAII (Resource Acquisition Is Initialization) ir išmanieji rodykliai.