Mediumdestructorexceptions

Можно ли бросать исключения из деструктора?

1Постановка

Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.

2Решение

Технически можно, но почти всегда плохая идея. Если деструктор бросает во время unwinding (уже активно другое исключение) — std::terminate. С C++11 деструкторы неявно noexcept.

class FileWriter {
    FILE* f_;
public:
    ~FileWriter() {
        if (std::fclose(f_) != 0) {
            // НЕ бросать! логируем и проглатываем
            std::cerr << "fclose failed";
        }
    }
    // отдельный метод для явной обработки ошибки
    bool close() { return std::fclose(f_) == 0; }
};

Если операция в деструкторе может упасть — дайте пользователю явный close()/flush(), а в деструкторе логируйте и проглатывайте.

3Как отвечать

  • Сначала уточните условия и ограничения, покажите аналитическое мышление.
  • Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
  • Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡

На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.