Определение вывода программы с исключениями в деструкторе

Ни один из обработчиков не напечатает свою цифру: исключение из деструктора при раскрутке стека приводит к std::terminate. В C++11 и новее этот деструктор также неявно noexcept.

Короткий ответ

Что ответить на собеседовании

Ни один из обработчиков не напечатает свою цифру: исключение из деструктора при раскрутке стека приводит к std::terminate. В C++11 и новее этот деструктор также неявно noexcept.

Подробный разбор

Ответ с пояснениями

Условие

Укажите, какой текст будет напечатан в консоль после выполнения следующего кода.

#include <iostream>

using namespace std;

struct explode_exception : public std::exception {};
struct top_exception : public std::exception {};

struct Explosive
{
    ~Explosive()
    {
        throw explode_exception();
    }
};

int main()
{
    try
    {
        Explosive explosive;
        throw int(5);
    }
    catch (const std::exception&)
    {
        cout << "1";
        // обработчик 1
    }
    catch (top_exception&)
    {
        cout << "2";
        // обработчик 2
    }
    catch (explode_exception&)
    {
        cout << "3";
        // обработчик 3
    }
    catch (int&)
    {
        cout << "4";
        // обработчик 4
    }

    return 0;
}

Ответ

Ни один из обработчиков не напечатает свою цифру: исключение из деструктора при раскрутке стека приводит к std::terminate. В C++11 и новее этот деструктор также неявно noexcept.

После throw int(5) начинается уничтожение локального explosive. Его деструктор выбрасывает второе исключение до перехода в обработчик int, и нормальное выполнение прекращается. Системная диагностика возможна, но она не является выводом этих cout.

Даже явное noexcept(false) не разрешает выпускать новое исключение из деструктора во время обработки первого. Ошибку очистки следует обработать внутри деструктора. Обработчики производных исключений обычно ставят раньше обработчика std::exception, но здесь перестановка не спасёт программу.

Источник: eel.is.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее