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

Ни одна цифра из catch не будет напечатана: при обработке primary_exception деструктор выбрасывает новое исключение, и вызывается std::terminate.

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

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

Ни одна цифра из catch не будет напечатана: при обработке primary_exception деструктор выбрасывает новое исключение, и вызывается std::terminate.

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

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

Условие

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

# include <iostream>

using namespace std;

struct expl_exception : public std::exception {};
struct primary_exception : public std::exception {};

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

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

    return 0;
}

Ответ

Ни одна цифра из catch не будет напечатана: при обработке primary_exception деструктор выбрасывает новое исключение, и вызывается std::terminate.

Первичный обработчик ещё не начал работу — перед ним необходимо уничтожить локальный explosive. В C++11+ деструктор дополнительно неявно noexcept, что само по себе запрещает выход исключения.

Если убрать бросок из деструктора, primary_exception попадёт в первый catch для std::exception и будет выведено 1, а не 2. Более конкретные обработчики нужно располагать раньше базового. Но перестановка catch не исправляет исходную проблему деструктора.

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

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

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

Подробнее