Исключения не должны покидать деструктор
Проблема: если исключение вылетает во время раскрутки стека из-за другого исключения, программа аварийно завершается через std::terminate.
В С++11 и новее деструкторы неявно помечаются как noexcept.
Неправильно:
#include <iostream>
#include <stdexcept>
class SocketConnection {
int socket_fd_;
public:
SocketConnection() : socket_fd_(1) {}
~SocketConnection() {
if (close_connection() != 0)
throw std::runtime_error("Failed to close socket"); // Опасно!
}
int close_connection() {
// Системный вызов close() может вернуть -1 при ошибке
return -1; // Имитация ошибки
}
};
int main() {
try {
SocketConnection conn;
throw std::runtime_error("Some other error");
} catch (...) {
// Деструктор conn выбросит второе исключение
// std::terminate()!
}
}
Правильно:
class SocketConnection {
int socket_fd_;
public:
SocketConnection() : socket_fd_(1) {}
~SocketConnection() {
if (close_connection() != 0) {
// Логгируем, а не бросаем исключение
std::cerr << "Warning: error closing socket\n";
}
}
int close_connection() {
// Системный вызов close()...
return -1;
}
};