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:
- Kodas, kuris gali sukelti klaidą, dedamas į
trybloką. - Jei
trybloke įvyksta išimtis (naudojantthrow), įprastas programos vykdymas nutraukiamas. - Sistema ieško tinkamo
catchbloko, kuris gali apdoroti sugeneruotą išimtį (pagal tipą). - Jei randamas tinkamas
catch, jo kodas vykdomas. - Jei tinkamas
catchnerandamas 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.