Как работают с исключениями и блоком try catch

182
08 июля 2019, 09:10

Вот есть блок try catch, в нём можно обрабатывать исключения. А как им корректно пользоваться? Если мы обрабатываем какие-то данные в try{обработка данных}, то при каком-то некорректном поведении мы попадаем в блок catch(...){данные об ошибке и их обработка}. Тут всё, кажется, просто и понятно. Но как же этим пользоваться в больших проектах, где все дальнейшие строки кода зависят от результата обработки в этом try catch?

Вот небольшой тривиальный пример, который мне пришёл в голову. Корректна ли в общем такая архитектура?

bool DIV(int a, int b) {
    if (b == 0) throw 1;
    int c = a / b;
    std::cout << c << std::endl;
    return false;
}
int main()
{
    bool Continue = true;
    int a, b;   
    while (Continue) 
    {
        try
        {
            std::cin >> a;
            std::cin >> b;
            Continue = DIV(a, b);
        }
        catch (...)
        {
            std::cout << "Error" << std::endl;
        }
        std::cout << "Next:" << std::endl;
    }
    return 0;
}
Answer 1

Исключения позволяют отложить обработку возникшей ошибки (исключительной ситуации) до момента, когда будет ясно как эту ошибку обработать. При этом по умолчанию (т.е. без какого-либо обработчика) ошибка не может быть просто проигнорирована, как это можно было бы делать со всевозможными кодами возвратов из функций или вариациями глобальной переменной errno. Если исключение вывалится на глобальный уровень, произойдёт аварийное завершение программы (вызовется std::terminate).

Если есть вся необходимая информация что делать с ошибкой по месту её проверки, то более правильным вариантом остаётся обычный if без каких-либо исключений вовсе. Но если есть какая-то, возможно, довольно длинная цепочка вложенных вызовов и проблема возникает далеко внутри от внешнего кода, который может, например, выполнить вывод диагностического сообщения пользователю в графическом интерфейсе, или записать в лог, или сделать что-то ещё, о чём не может даже догадываться разработчик функции, в которой может произойти какая-то критическая ошибка, то исключениям тут самое место.

READ ALSO
Стандартные алгоритмы std::copy_backward и std::reverse_copy

Стандартные алгоритмы std::copy_backward и std::reverse_copy

Не смог найти пример, когда удобнее использовать std::copy_backward вместо std::reverse_copyИ чем же существование второго не заставляет забывать о первом?...

154
Как сейчас поживает венгерская нотация?

Как сейчас поживает венгерская нотация?

Помнится в начале существования Windows компания Микрософт сильно продвигала так называемую венгерскую нотациюТакже многие программистские...

147
работа с enum class

работа с enum class

у меня есть два enum class

148