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) и умни указатели.