В С++ RAII часто выступает в качестве превосходного подхода к обработке исключений: если генерируется исключение, стек разматывается, все деструкторы вызываются и ресурсы очищаются.
Однако это создает проблему с сообщением об ошибках. Скажем, что очень общая функция не работает, стек разматывается на верхний уровень, и все, что я вижу в журналах, будет:
Не удалось прочитать из сокета: соединение reset с помощью одноранговой сети.
... или любое одинаково общее сообщение. Это не говорит о контексте, из которого выбрано исключение. Особенно, если я запускаю что-то вроде цикла обработки очереди событий.
Конечно, я мог бы обернуть каждый вызов сокетов с помощью блока try/catch, поймать исключение, построить новый с более подробной информацией о контекстах и повторно бросить его, но он побеждает цель иметь RAII и медленно, но верно ухудшается, чем обрабатывать коды ошибок возврата.
Какой лучший способ для подробного описания ошибок в стандартном С++? Я также открыт для предложений, связанных с Boost.