Ни одна цифра из 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 не исправляет исходную проблему деструктора.