Механизм обработки исключений в C#

Где должны обрабатываться исключения? Ответ можно найти, применив вариант шаблона Expert (Эксперт), который устанавливает, что работа должна выполняться сущностью, являющейся экспертом в данной области.

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

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

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

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

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

Избегайте применения исключений для управления потоком выполнения

Может возникнуть искушение применять исключения для управления потоком выполнения в сложных методах. Это никогда нельзя считать хорошей идеей по двум причинам.

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

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

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

Такие пассивные подходы к обработке ошибок могут быстро привести к серьезным проблемам. Исключения представляют собой синтаксически сжатый и унифицированный способ для описания и обработки ошибочных условий, который позволяет не засорять код множеством блоков if и других традиционных (не связанных с исключениями) конструкций обработки ошибок. В то же время исполняющая система поддерживает исключения и выполняет огромную работу, когда исключение сгенерировано.

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

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

Вы можете следить за любыми ответами на эту запись через 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