РЕДАКТИРОВАТЬ: я согласен с другими, которые говорят, что, начиная с 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<Exception> 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 лает на вас , и поэтому вы должны также добавить атрибут в свой код , который точно пронестись делать с запущенной программой, и только там , чтобы сказать 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;
}