По порядку Middle Исключения обновлено
Что происходит при броске исключения
Вопрос
Расставьте по порядку, что происходит после throw std::runtime_error("x") внутри функции, вызванной из try-блока, у которого есть подходящий catch.
Попробуйте сами
Расставьте шаги по порядку стрелками.
- 1Уничтожаются локальные объекты try-блока
- 2Ищется подходящий обработчик catch выше по стеку
- 3Уничтожаются локальные объекты функции в обратном порядке создания
- 4После выхода из catch уничтожается объект исключения
- 5Создаётся объект исключения
- 6Выполняется тело catch
Показать ответ и разбор
Коротко
В GCC и Clang (Itanium ABI) раскрутка двухфазная: сначала ищется обработчик, и только если он найден, выполняется очистка стека с вызовом деструкторов от самого глубокого кадра к обработчику. Объект исключения живёт до конца последнего обработчика, который его не перебросил.
Правильный порядок
- 1Создаётся объект исключения
- 2Ищется подходящий обработчик catch выше по стеку
- 3Уничтожаются локальные объекты функции в обратном порядке создания
- 4Уничтожаются локальные объекты try-блока
- 5Выполняется тело catch
- 6После выхода из catch уничтожается объект исключения
Разбор
В GCC и Clang (Itanium ABI) раскрутка двухфазная: сначала ищется обработчик, и только если он найден, выполняется очистка стека с вызовом деструкторов от самого глубокого кадра к обработчику. Объект исключения живёт до конца последнего обработчика, который его не перебросил.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.