Вопрос C # - как заполнить оператор catch конкретными исключениями из кода в попытке? - PullRequest
2 голосов
/ 29 января 2010

Я использую VS2008 и ReSharper тоже.

Мой вопрос заключается в том, как мне автоматизировать создание блока try / catch, для которого специально заполняется catch с возможным исключением из блока try? (то есть не только в исключении ex)

Справочная информация. Попытка помочь следовать рекомендациям, которые я прочитал: «Не перехватывать (Исключение) более одного раза для потока. Хороший код генерирует исключения по мере необходимости и обрабатывает только те исключения, которые он умеет обрабатывать». *

спасибо

Ответы [ 2 ]

1 голос
/ 29 января 2010

Из того, что я прочитал, это было одной из основных причин, по которой команда C # решила не реализовывать проверенные исключения, подобные Java - они хотели не допустить такого рода обработки исключений.

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

Кроме того, существуют всевозможные особые системные исключения, которые могут генерироваться платформой, такие как OutOfMemoryException, BadImageFormatException, AppDomainUnloadedException и т. Д., Которые не генерируются напрямую конкретным методом. вы вызываете, но пробиваетесь через это из среды выполнения .NET. Если бы вы хотели поймать все возможных исключений, вам бы пришлось их также отловить, но по большей части это было бы бесполезным упражнением, поскольку вы мало что можете сделать, когда получите StackOverflowException - и опять же, как правило, вы не должны пытаться.

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

1 голос
/ 29 января 2010

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

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

...