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