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

Исключение из деструктора

Вопрос

Деструктор локального объекта бросает исключение, пока раскручивается стек из-за другого исключения. Что произойдёт?

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

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

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

Коротко

Правильный ответ: std::terminate: два активных исключения одновременно невозможны. Даже без раскрутки деструктор по умолчанию noexcept, и исключение из него вызовет std::terminate.

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

  1. std::terminate: два активных исключения одновременно невозможныправильный ответ
  2. Второе исключение заменит первое и полетит к ближайшему catch
  3. Оба исключения поймает ближайший catch и обработает по очереди
  4. Исключение из деструктора будет проигнорировано, раскрутка продолжится

Разбор

Даже без раскрутки деструктор по умолчанию noexcept, и исключение из него вызовет std::terminate. А при раскрутке C++ в принципе не умеет обрабатывать второе исключение, поэтому тоже terminate. Отсюда правило: деструкторы не бросают; ошибки освобождения логируют или отдают через отдельный метод вроде close().

  • Замены и объединения исключений в C++ нет.
  • Игнорирования тоже.

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

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

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