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. Чим більше гарантій, тим складнішим може бути ваш код.

Останні думки — обробка помилок - це настільки ж мистецтво, як і наука. Вона формує те, як ваша програма виживає у дикій природі. Не перевикористовуйте виключення. Прагніть до читабельного, зручного для підтримки коду.

Див. також