Рассматривается обработка ошибок в C++. В качестве примера создадим и улучшим функцию с помощью обработки исключений.
Создание функции без обработки ошибок
Функция divide выполняет деление двух чисел типа float:
float divide(float a, float b) {
return a / b;
}
Вызов с корректными аргументами (например, divide(5.2, 1.2)) выведет результат. Деление на ноль приведёт к ошибке.
Обработка ошибок с помощью throw
Добавим проверку и выброс исключения при делении на ноль:
float divide(float a, float b) {
if (b == 0) {
throw "Деление на ноль!"; // Выбрасываем исключение (строка)
}
return a / b;
}
Если b равно нулю, функция выбросит исключение со строкой «Деление на ноль!». Выбрасывание строки может привести к ошибке компиляции в некоторых версиях C++. Надежнее использовать числовое значение.
Обработка исключений с помощью try-catch
Для обработки выброшенного исключения используется конструкция try-catch:
try {
divide(5.2, 0); // Вызов функции, которая может выбросить исключение
} catch (const char* error) { // Ловим исключение типа const char*
if (strcmp(error, "Деление на ноль!") == 0) {
std::cout << "Ошибка при делении на 0." << std::endl;
}
}
Блок try содержит код, который может выбросить исключение. При возникновении исключения, выполнение блока try прерывается, и управление передаётся блоку catch. Блок catch ловит исключения типа const char* и проверяет, соответствует ли оно сообщению «Деление на ноль!».
Улучшение обработки исключений: использование чисел
Использование строк в качестве исключений проблематично. Лучше использовать целые числа:
float divide(float a, float b) {
if (b == 0) {
throw 100; // Выбрасываем исключение (число)
}
return a / b;
}
try {
divide(5.2, 0);
} catch (int error) {
if (error == 100) {
std::cout << "Ошибка при делении на 0." << std::endl;
}
}
Этот вариант более надёжен.
Зачем нужны обработчики исключений?
В простом примере обработка деления на ноль может показаться избыточной. Однако, обработчики исключений необходимы для работы со сложными библиотеками, генерирующими различные ошибки. try-catch позволяет обрабатывать эти ошибки без остановки программы.
Конструкция try-catch — важный инструмент для обработки ошибок и исключений в C++. Хотя в простых программах она может показаться излишней, её использование необходимо при работе со сложными библиотеками и большим объёмом кода. Рассмотрены основы работы с обработчиками исключений.