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 подскажет развёрнутый ответ в реальном времени.