RAII против исключений

Чем больше мы используем RAII в C ++, тем больше мы оказываемся с деструкторами, которые делают нетривиальное освобождение. Теперь освобождение (завершение, как бы вы его ни называли) может завершиться неудачей, и в этом случае исключения действительно единственный способ сообщить кому-либо наверху о нашей проблеме освобождения. Но опять же, метание деструкторов - плохая идея из-за возможности исключения, генерируемого при разматывании стека.std::uncaught_exception() позволяет узнать, когда это произойдет, но не намного, поэтому кроме того, что вы можете записать сообщение до завершения, вы ничего не сможете сделать, если только вы не захотите оставить свою программу в неопределенном состоянии, где некоторые вещи освобождаются / завершаются а некоторые нет.

Один из подходов - иметь деструкторы без бросков. Но во многих случаях это просто скрывает настоящую ошибку. Наш деструктор может, например, закрывать некоторые управляемые RAII соединения с БД в результате возникновения какого-то исключения, и эти соединения с БД могут не закрыться. Это не обязательно означает, что мы согласны с завершением программы на этом этапе. С другой стороны, регистрация и отслеживание этих ошибок не является решением для каждого случая; иначе у нас не было бы необходимости в исключениях для начала. С деструкторами без бросков мы также сталкиваемся с необходимостью создавать функции "reset ()", которые должны вызываться до уничтожения, но это просто наносит ущерб всей цели RAII.

Другой подход простопусть программа завершится, так как это самая предсказуемая вещь, которую вы можете сделать.

Некоторые люди предлагают цепочку исключений, чтобы можно было обрабатывать более одной ошибки одновременно. Но я, честно говоря, никогда не видел, чтобы это было сделано в C ++, и я понятия не имею, как реализовать такую вещь.

Так что это либо RAII, либо исключения. Не так ли? Я склоняюсь к деструкторам без бросков; главным образом потому, что это делает вещи простыми (r). Но я действительно надеюсь, что есть лучшее решение, потому что, как я уже сказал, чем больше мы используем RAII, тем больше мы используем dtors, которые делают нетривиальные вещи.

аппендикс

Я добавляю ссылки на интересные статьи и обсуждения по теме:

Метательные деструкторыОбсуждение StackOverflow напроблемы с SEHОбсуждение StackOverflowметательные-деструкторов (спасибо, Мартин Йорк)Джоэл об исключенияхSEH считается вреднымОбработка исключений в CLR что также касается цепочки исключенийХерб Саттер на std :: uncaught_exception и почему это не так полезно, как вы думаетеИсторическая дискуссия по делу с интересными участниками (долго!)Страуструп объясняяRAIIАндрея АлександрескуScope Guard

Ответы на вопрос(7)

Ваш ответ на вопрос