C++:
Обробка помилок
Як це робити:
Ось базовий блок try-catch для обробки винятку:
#include <iostream>
#include <stdexcept>
int main() {
try {
throw std::runtime_error("Ой! Щось пішло не так.");
} catch (const std::exception& e) {
std::cerr << "Помилка: " << e.what() << std::endl;
}
return 0;
}
Приклад виводу:
Помилка: Ой! Щось пішло не так.
Поглиблено
C++ мав обробку помилок з самого початку. Найбазовіша форма полягала у перевірці значень, що повертаються. Якщо ви давно працюєте з програмуванням, ви пам’ятаєте дочасні дні: C з класами і ручною перевіркою помилок.
Пізніше з’явилися виключення у C++, які дали нам структурований спосіб впоратися з несподіваними проблемами. Виняток викликається з throw
і перехоплюється з try/catch
.
Часто виникають два типи помилок: логічні помилки, наприклад, неправильний розрахунок, та помилки часу виконання, наприклад, доступ до недійсної адреси пам’яті. Виключення ідеально підходять для помилок часу виконання. Для логічних помилок часто краще використовувати перевірки з твердженнями або коди помилок.
Триває дискусія про виключення проти кодів помилок. Виключення можуть бути повільнішими і можуть призвести до складних потоків управління. Коди помилок, хоча й швидші, можуть зробити код забрудненим і важчим для підтримки. Це компроміс, тому знання вашого випадку використання є ключовим.
C++17 ввів std::optional
і std::variant
, які є альтернативами виключенням. Вони корисні для функцій, які можуть, а можуть і не повернути дійсний результат.
Безпека у випадку виключень може бути ще одним головним болем. Це стосується гарантії, яку надає ваш код, незважаючи на виключення. Є три рівні: базовий, сильний і nothrow. Чим більше гарантій, тим складнішим може бути ваш код.
Останні думки — обробка помилок - це настільки ж мистецтво, як і наука. Вона формує те, як ваша програма виживає у дикій природі. Не перевикористовуйте виключення. Прагніть до читабельного, зручного для підтримки коду.