В C++11 и новее сначала выводится Hello World, затем вызывается std::terminate. connect не вызван, а исключение из disconnect выходит через неявно noexcept-деструктор.
Что выведет программа с обработкой исключений (пример 5)
В C++11 и новее сначала выводится Hello World, затем вызывается std::terminate. connect не вызван, а исключение из disconnect выходит через неявно noexcept-деструктор.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Укажите, какой текст появится в консоли при выполнении следующего кода.
#include <iostream>
struct connection_t {
void connect() { isConnected = true; }
void disconnect() {
if (!isConnected) {
throw std::runtime_error("not connected");
}
}
~connection_t() {
disconnect();
}
bool isConnected = false;
};
int main() {
std::cout << "Hello World" << std::endl;
try {
connection_t db;
}
catch (std::exception& e) {
std::cout << e.what() << std::endl;
return -1;
}
return 0;
}
Ответ
В C++11 и новее сначала выводится Hello World, затем вызывается std::terminate. connect не вызван, а исключение из disconnect выходит через неявно noexcept-деструктор.
Внешний catch не перехватит это исключение, поэтому строка not connected из его тела не гарантирована. Возможна отдельная диагностика среды выполнения. В исходник также следует явно добавить .
Исправление: сделать уничтожение безопасным для неподключённого объекта и не выпускать ошибки из деструктора. Явная операция disconnect при необходимости может сообщать об ошибке вызывающему коду и после успеха должна обновлять isConnected.