Стратегии, чтобы избежать добавления try / catch для каждого блока метода в кодовой базе? - PullRequest
2 голосов
/ 04 ноября 2010

Довольно утомительно писать try / catch в каждом блоке метода.

Кроме AOP, есть ли способ избежать этого и перехватить все исключения? Было бы достаточно просто перехватить их на уровне глобального обработчика ошибок (например, как в ASP.NET).

Спасибо

Ответы [ 3 ]

4 голосов
/ 04 ноября 2010

Лучший совет, который я слышал по этому вопросу (на самом деле где-то на SO), был «поймать исключение, только если вы собираетесь с ним справиться». То есть имеет смысл использовать блок catch в этом методе, только если у этого метода есть средства обработки исключения. Например, если метод должен по какой-то причине всегда возвращать значение, а исключение либо записывается в журнал без вывода сообщений, либо каким-либо образом указывается в значении (например, сообщение об ошибке, прикрепленное к некоторому пользовательскому DTO или чему-то еще). Нет ничего плохого в том, что в стеке всплыло исключение и предполагается, что вызывающая сторона его обработает.

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

Следует также отметить (я предполагаю, что вы говорите о .NET здесь), что блок try не обязательно должен всегда сопровождаться блоком catch. Вы можете try{}finally{} позаботиться об очистке после исключения (например, изящного закрытия внешнего ресурса), не удосужившись перехватить исключение и вместо этого позволить ему всплыть соответствующим образом.

1 голос
/ 05 ноября 2010

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

1 голос
/ 04 ноября 2010

Я согласен с Дэвидом. Вот мой основной набор правил, или ... как пиратский код, рекомендации ...

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

  • Try / catch следует применять только тогда, когда вы действительно можете что-то сделать с исключением. И нет, регистрация исключения не делает что-то с этим.

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

  • Блоки try / catch стоят дорого, не кладите их, если в этом нет необходимости.

  • Никогда, и я имею в виду НИКОГДА !!! используйте try / catch для логического потока.

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