Обеспечение нейтральности к исключениям

Когда исключения были впервые добавлены к С++, многие разработчики были впечатлены возможностью генерировать их, перехватывать и обрабатывать. Фактически в то время существовало распространенное заблуждение, что обработка исключений состоит из стратегического размещения операторов try по всему коду и добавления throw при необходимости.

Со временем сообщество разработчиков осознало, что беспорядочное разбрасывание операторов try ухудшает читабельность кода, когда в большинстве случаев единственной целью, которой они пытались достичь, было аккуратно убрать за сгенерированным исключением и позволить ему распространяться далее по стеку.

Хуже того, это затрудняло написание кода и его дальнейшее сопровождение.

Код, не обрабатывающий исключений, но от которого ожидается правильное поведение в отношении этих исключений, называется кодом, нейгттральныл! к исключениям.

Ясно, что должен был существовать лучший способ написания нейтрального по отношению к исключениям кода, без необходимости полагаться повсюду на операторы try. Фактически единственное место, где есть необходимость в операторе try — это точка, в которой в ответ на исключение производится любого рода восстановление или протоколирование системы.

Со временем многие начали понимать, что написание операторов try было фактически наименее значимой частью написания безопасного и нейтрального к исключениям кода. Вообще говоря, единственный код, который должен перехватывать исключения — это код, знающий, как исправить ситуацию.

Такой код может находиться даже в главной точке входа и просто выполнять сброс системы в некоторое известное начальное состояние, по сути, перезапуская ее.

Под нейтральным к исключениям кодом подразумевается код, в котором не предусмотрена возможность каким-либо специальным образом обрабатывать исключения, но, тем не менее, который должен изящно справляться с исключительными условиями. Обычно этот код расположен где-то в стеке — между кодом, сгенерировавшим исключение, и кодом, перехватившим его, — и он не должен зависеть от исключения на его пути в стеке.

Здесь некоторые могли подумать об операторе throw без параметров, который позволяет перехватить исключение, выполнить какую-то обработку и затем повторно сгенерировать исключение.

Однако далее будет представлена намного более ясная техника, которая позволяет писать нейтральный к исключениям код без использования одиночного оператора try и получать при этом более устойчивый и читабельный код.

Вы можете следить за любыми ответами на эту запись через RSS 2.0 ленту. Вы можете оставить ответ, или trackback с вашего собственного сайта.

Оставьте отзыв

XHTML: Вы можете использовать следующие теги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

 
Rambler's Top100