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

throw; против throw e;

Вопрос

Внутри catch (Base& e) (поймали объект типа Derived) написано throw e;. Что полетит дальше?

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

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

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

Коротко

Правильный ответ: Копия типа Base: динамический тип потерян, а throw; сохранил бы его. throw e; создаёт новый объект исключения из выражения e, тип берётся статический: Base.

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

  1. Копия типа Base: динамический тип потерян, а throw; сохранил бы егоправильный ответ
  2. Исходный объект Derived: throw e; перебрасывает текущее исключение
  3. Ничего не полетит: повторный бросок внутри catch запрещён
  4. Копия типа Derived: копирование идёт по динамическому типу объекта

Разбор

throw e; создаёт новый объект исключения из выражения e, тип берётся статический: Base. Внешний catch (Derived&) его уже не поймает. throw; без операнда перебрасывает текущий объект исключения как есть.

  • Исходный объект летит только при throw;.
  • Перебрасывать можно.
  • Копирование при броске идёт по статическому типу, отсюда и срезка.

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

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

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