Исключения - это аномалии времени выполнения, такие как потеря подключения к базе данных или ввод непредвиденных данных, которые нарушают нормальное функционирование программы. Обработка исключений в приложении позволяет корректно выйти из затруднительной ситуации.
Обработка ошибок в С++ включает следующие компоненты:
Оператор throw
используется частью кода, обнаружившего проблему, с которой не может справиться. throw передает исключение и имеет вид:
//деление двух чисел
#include <iostream>
#include <stdexcept>
using namespace std;
int main() {
setlocale(LC_ALL, "Russian");
cout << "Введите 2 числа:" << endl;
double v1 = 0, v2 = 0, result = 0;
cin >> v1 >> v2;
if (v2 == 0)
throw runtime_error("На ноль делить нельзя!");
else {
result = v1 / v2;
cout << v1 << " / " << v2 << " = " << result << endl;
}
return 0;
}
Но передать исключение недостаточно, необходимо организовать обработку. Для этого используют конструкцию try catch
.
Блок try
является частью обработки исключений. Состоит из ключевого слова try
и завершается одной или несколькими директивами catch
.
Синтаксис:
try {
операторы_программы
} catch(объявление_исключения) {
операторы_обработчика
} catch(объявление_исключения) {
операторы_обработчика
} // ...
Исключения, переданные из кода в блоке try
, обрабатываются в одном из разделов catch
.
Исключения содержатся в заголовке stdexcept
. В таблице приведены стандартные классы исключений:
Исключение | Объяснение |
---|---|
exception |
Наиболее общий вид проблемы |
runtime_error |
Проблема, которая может быть обнаружена только во время выполнения |
range_error |
Ошибка времени выполнения: полученный результат превосходит допустимый диапазон значений |
overflow_error |
Ошибка времени выполнения: переполнение регистра при выполнении |
underflow_error |
Ошибка времени выполнения: недополнение регистра при выполнении |
logic_error |
Ошибка в логике программы |
domain_error |
Логическая ошибка: аргумент, для которого не существует результата |
invalid_argument |
Логическая ошибка: неподходящий аргумент |
length_error |
Логическая ошибка: попытка создать объект большего размера, чем максимально допустимый для данного типа |
out_of_range |
Логическая ошибка: используемое значение вне допустимого диапазона |
В классах исключений определена только одна функция what()
, не получающая никаких аргументов.
Перепишем предыдущую программу с использованием try catch
:
//деление двух чисел
#include <iostream>
#include <stdexcept>
using namespace std;
int main() {
setlocale(LC_ALL, "Russian");
cout << "Введите 2 числа:" << endl;
double v1 = 0, v2 = 0, result = 0;
try {
cin >> v1 >> v2;
if (!v2) throw runtime_error("На ноль делить нельзя!");
result = v1 / v2;
cout << v1 << " / " << v2 << " = " << result << endl;
} catch (runtime_error err) {
cout << err.what() << endl;
}
return 0;
}