Ни один из показанных catch не подходит для std::string, поэтому программа завершится через std::terminate. Цифры 1–4 не будут напечатаны этими обработчиками.
Что выведет программа с бросаемыми исключениями в деструкторе?
Ни один из показанных catch не подходит для std::string, поэтому программа завершится через std::terminate. Цифры 1–4 не будут напечатаны этими обработчиками.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какой текст появится в консоли после выполнения следующего кода.
#include <iostream>
using namespace std;
struct explosion_exception : public std::exception {};
struct primary_exception : public std::exception {};
struct Explosive
{
~Explosive()
{
throw explosion_exception();
}
};
int main()
{
try
{
Explosive explosive;
throw string("4545");
}
catch (const std::exception&)
{
cout << "1";
// обработчик 1
}
catch (primary_exception&)
{
cout << "2";
// обработчик 2
}
catch (explosion_exception&)
{
cout << "3";
// обработчик 3
}
catch (int&)
{
cout << "4";
// обработчик 4
}
return 0;
}
Ответ
Ни один из показанных catch не подходит для std::string, поэтому программа завершится через std::terminate. Цифры 1–4 не будут напечатаны этими обработчиками.
std::string не наследуется от std::exception. Если подходящий обработчик не найден вообще, выполняется ли раскрутка стека перед terminate, зависит от реализации.
Если деструктор Explosive всё же будет вызван при раскрутке, он создаёт дополнительную причину terminate: выпускает исключение и нарушает свой неявный noexcept в C++11+. Поэтому нельзя объяснять исходник только как гарантированный вызов деструктора. Для переносимой компиляции строк следует явно подключать .
Источник: eel.is.