Выбор ответа Junior Исключения спрашивают часто обновлено
Как ловить исключения
Вопрос
Почему исключения рекомендуют ловить как catch (const std::exception& e), а не catch (std::exception e)?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Ловля по значению копирует объект и срезает его до базового класса. При ловле по значению создаётся копия типа std::exception: виртуальный what() наследника больше не вызывается, лишние поля пропадают, а копия может сама бросить.
Варианты ответа
- По значению поймать нельзя:
catchс копией не скомпилируется - Ловля по ссылке быстрее бросает исключение: не нужен поиск типа
- Разницы нет: компилятор сам заменит ловлю по значению на ссылку
- Ловля по значению копирует объект и срезает его до базового классаправильный ответ
Разбор
При ловле по значению создаётся копия типа std::exception: виртуальный what() наследника больше не вызывается, лишние поля пропадают, а копия может сама бросить. По константной ссылке ловится настоящий объект. GCC предупреждает -Wcatch-value.
- По значению ловить можно, это компилируется.
- Скорость броска от вида
catchне зависит. - Разница в поведении принципиальная.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.