По порядку Middle Исключения обновлено

Что происходит при броске исключения

Вопрос

Расставьте по порядку, что происходит после throw std::runtime_error("x") внутри функции, вызванной из try-блока, у которого есть подходящий catch.

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

Расставьте шаги по порядку стрелками.

  1. 1
    Уничтожаются локальные объекты try-блока
  2. 2
    Ищется подходящий обработчик catch выше по стеку
  3. 3
    Уничтожаются локальные объекты функции в обратном порядке создания
  4. 4
    После выхода из catch уничтожается объект исключения
  5. 5
    Создаётся объект исключения
  6. 6
    Выполняется тело catch
Показать ответ и разбор

Коротко

В GCC и Clang (Itanium ABI) раскрутка двухфазная: сначала ищется обработчик, и только если он найден, выполняется очистка стека с вызовом деструкторов от самого глубокого кадра к обработчику. Объект исключения живёт до конца последнего обработчика, который его не перебросил.

Правильный порядок

  1. 1
    Создаётся объект исключения
  2. 2
    Ищется подходящий обработчик catch выше по стеку
  3. 3
    Уничтожаются локальные объекты функции в обратном порядке создания
  4. 4
    Уничтожаются локальные объекты try-блока
  5. 5
    Выполняется тело catch
  6. 6
    После выхода из catch уничтожается объект исключения

Разбор

В GCC и Clang (Itanium ABI) раскрутка двухфазная: сначала ищется обработчик, и только если он найден, выполняется очистка стека с вызовом деструкторов от самого глубокого кадра к обработчику. Объект исключения живёт до конца последнего обработчика, который его не перебросил.

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

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

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