Вот есть блок 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;
}
Исключения позволяют отложить обработку возникшей ошибки (исключительной ситуации) до момента, когда будет ясно как эту ошибку обработать. При этом по умолчанию (т.е. без какого-либо обработчика) ошибка не может быть просто проигнорирована, как это можно было бы делать со всевозможными кодами возвратов из функций или вариациями глобальной переменной errno
. Если исключение вывалится на глобальный уровень, произойдёт аварийное завершение программы (вызовется std::terminate
).
Если есть вся необходимая информация что делать с ошибкой по месту её проверки, то более правильным вариантом остаётся обычный if
без каких-либо исключений вовсе. Но если есть какая-то, возможно, довольно длинная цепочка вложенных вызовов и проблема возникает далеко внутри от внешнего кода, который может, например, выполнить вывод диагностического сообщения пользователю в графическом интерфейсе, или записать в лог, или сделать что-то ещё, о чём не может даже догадываться разработчик функции, в которой может произойти какая-то критическая ошибка, то исключениям тут самое место.
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Не смог найти пример, когда удобнее использовать std::copy_backward вместо std::reverse_copyИ чем же существование второго не заставляет забывать о первом?...
Помнится в начале существования Windows компания Микрософт сильно продвигала так называемую венгерскую нотациюТакже многие программистские...