Используете ли вы исключения в работе и проектах?
Что проверяют
Есть ли у вас осознанная позиция: где исключения уместны, во что обходятся и что делать, если в проекте они запрещены. Следом обычно спрашивают про гарантии безопасности исключений и про noexcept.
Как отвечать
Нормальный ответ начинается с «зависит от проекта», но сразу с аргументами:
- когда да: ошибки, которые нельзя обработать на месте и нужно поднять на несколько уровней: не открылся файл, не разобрался конфиг, отказала сеть. Бросают по значению, ловят по константной ссылке, свои типы наследуют от
std::runtime_errorилиstd::logic_error; - RAII: исключения безопасны только там, где ресурсами владеют объекты. Сырой
newбез умного указателя при исключении даёт утечку; - гарантии: базовая (инварианты целы, утечек нет), строгая (операция либо прошла, либо состояние не изменилось),
nothrow. Классический пример:std::vectorпри росте перемещает копируемые элементы, только если конструктор перемещения помеченnoexcept, иначе копирует; - цена: в распространённых ABI путь без исключения почти бесплатный, а выброс дорогой: раскрутка стека по таблицам занимает на порядки больше обычного возврата, и растёт размер бинарника;
- когда нет: игровые движки, встраиваемые системы, кодовые базы с
-fno-exceptions, горячие циклы с ожидаемыми ошибками. Там коды ошибок,std::error_code,std::optionalиstd::expectedиз C++23.
Важные границы: деструкторы неявно noexcept, и исключение из них вызывает std::terminate. Исключение не должно пересекать границу C API, а между потоками его передают через std::exception_ptr или std::future.
Опирайтесь на свой проект: что там принято и почему.
Где спотыкаются
Используют исключения для обычного потока управления, например ловят std::out_of_range в цикле вместо проверки индекса. Это медленно и плохо читается.
Ловят по значению или ставят catch (...) без повторного выброса. В первом случае объект срезается до базового класса, во втором ошибка молча исчезает.
Не знают, что непойманное исключение в std::thread вызывает std::terminate и роняет весь процесс. В фоновых задачах исключение ловят внутри потока или получают через std::async и future.get().