Выбор ответа Junior Исключения спрашивают часто обновлено

Как ловить исключения

Вопрос

Почему исключения рекомендуют ловить как catch (const std::exception& e), а не catch (std::exception e)?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Ловля по значению копирует объект и срезает его до базового класса. При ловле по значению создаётся копия типа std::exception: виртуальный what() наследника больше не вызывается, лишние поля пропадают, а копия может сама бросить.

Варианты ответа

  1. По значению поймать нельзя: catch с копией не скомпилируется
  2. Ловля по ссылке быстрее бросает исключение: не нужен поиск типа
  3. Разницы нет: компилятор сам заменит ловлю по значению на ссылку
  4. Ловля по значению копирует объект и срезает его до базового классаправильный ответ

Разбор

При ловле по значению создаётся копия типа std::exception: виртуальный what() наследника больше не вызывается, лишние поля пропадают, а копия может сама бросить. По константной ссылке ловится настоящий объект. GCC предупреждает -Wcatch-value.

  • По значению ловить можно, это компилируется.
  • Скорость броска от вида catch не зависит.
  • Разница в поведении принципиальная.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме