РЕДАКТИРОВАТЬ: Я согласен с другими, которые говорят, что, начиная с C # 6. 0, фильтры исключений теперь отлично подходят для этого: catch (Exception ex) when (ex is ... || ex is ... )
За исключением того, что я все еще ненавижу макет с одной строкой и лично выложу код, как показано ниже. Я думаю, что это так же функционально, как и эстетично, так как я считаю, что это улучшает понимание. Некоторые могут не согласиться:
catch (Exception ex) when (
ex is ...
|| ex is ...
|| ex is ...
)
ОРИГИНАЛ:
Я знаю, что я немного опоздал на вечеринку здесь, но святой дым. , ,
Если перейти прямо к погоне, этот вид дублирует более ранний ответ, но если вы действительно хотите выполнить общее действие для нескольких типов исключений и сохранить все в чистоте и порядке в рамках одного метода, почему бы просто не использовать лямбда / закрытие / встроенная функция сделать что-то вроде следующего? Я имею в виду, что вполне вероятно, что в итоге вы поймете, что просто хотите сделать это закрытие отдельным методом, который вы можете использовать повсюду. Но тогда это будет очень легко сделать без реального структурного изменения остальной части кода. Правильно?
private void TestMethod ()
{
Action errorHandler = ( ex ) => {
// write to a log, whatever...
};
try
{
// try some stuff
}
catch ( FormatException ex ) { errorHandler ( ex ); }
catch ( OverflowException ex ) { errorHandler ( ex ); }
catch ( ArgumentNullException ex ) { errorHandler ( ex ); }
}
Я не могу не задаться вопросом (предупреждение : впереди немного иронии / сарказма), зачем же все эти усилия в основном просто заменить следующим:
try
{
// try some stuff
}
catch( FormatException ex ){}
catch( OverflowException ex ){}
catch( ArgumentNullException ex ){}
. , , с некоторым сумасшедшим изменением этого следующего запаха кода, я имею в виду пример, только чтобы сделать вид, что вы экономите несколько нажатий клавиш.
// sorta sucks, let's be honest...
try
{
// try some stuff
}
catch( Exception ex )
{
if (ex is FormatException ||
ex is OverflowException ||
ex is ArgumentNullException)
{
// write to a log, whatever...
return;
}
throw;
}
Потому что это, конечно, автоматически не более читабельно.
Конечно, я оставил три идентичных экземпляра /* write to a log, whatever... */ return;
из первого примера.
Но это своего рода моя точка зрения. Вы все слышали о функциях / методах, верно? Шутки в сторону. Напишите общую функцию ErrorHandler
и, например, вызывайте ее из каждого блока catch.
Если вы спросите меня, второй пример (с ключевыми словами if
и is
) и значительно менее читабелен, и одновременно значительно более подвержен ошибкам на этапе обслуживания вашего проекта.
Фаза обслуживания для тех, кто может быть относительно новичком в программировании, будет состоять из 98. 7% или более от общего срока службы вашего проекта, и бедняга, выполняющий техническое обслуживание, почти наверняка будет кем-то другим, кроме вас. И есть очень хороший шанс, что они будут тратить 50% своего времени на работу, ругаясь на ваше имя.
И, конечно, FxCop лает на вас, и поэтому вам нужно , а также добавить атрибут в ваш код, который имеет точное zip, связанное с работающей программой, и предназначен только для того, чтобы FxCop игнорировал проблему, возникающую в 99. В 9% случаев это абсолютно правильно в маркировке. И, извините, я могу ошибаться, но разве этот атрибут «игнорировать» не скомпилирован в ваше приложение?
Поможет ли поместить весь тест if
в одну строку, чтобы сделать его более читабельным? Я так не думаю. Я имею в виду, у меня был другой программист, яростно споривший давным-давно, что размещение большего количества кода в одной строке сделает его «работающим быстрее». "Но, конечно, он был совершенно безумным. Попытка объяснить ему (с открытым лицом - что было непросто), как интерпретатор или компилятор разбил бы эту длинную строку на отдельные операторы с одной инструкцией на строку - по существу, идентичные результату, если бы он пошел вперед и просто сделал код читабельным вместо того, чтобы пытаться перехитрить компилятор - не оказал на него никакого влияния. Но я отвлекся.
Сколько меньше для чтения это получает при добавлении еще трех типов исключений, через месяц или два? (Ответ: он получает , , лот , , менее читаемый).
Один из главных моментов, на самом деле, заключается в том, что основная часть форматирования текстового исходного кода, на который мы все смотрим каждый день, состоит в том, чтобы сделать его действительно, действительно очевидным для других людей, что на самом деле происходит, когда код выполняется , Потому что компилятор превращает исходный код во что-то совершенно другое и не заботится о вашем стиле форматирования кода. Так что все на одной линии - полный отстой.
Просто говорю. , ,
// super sucks...
catch( Exception ex )
{
if ( ex is FormatException || ex is OverflowException || ex is ArgumentNullException )
{
// write to a log, whatever...
return;
}
throw;
}