Что выведет программа с обработкой исключений (пример 5)

В C++11 и новее сначала выводится Hello World, затем вызывается std::terminate. connect не вызван, а исключение из disconnect выходит через неявно noexcept-деструктор.

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

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

В 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.

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

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

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

Подробнее