Исключения не должны покидать деструктор

Проблема: если исключение вылетает во время раскрутки стека из-за другого исключения, программа аварийно завершается через 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;
    }
};