EDIT: Я погоджуюся з іншими особами, які говорять про те, що на 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
функцію і, наприклад, зателефонуйте їй із кожного блоку лову.
Якщо ви запитаєте мене, другий приклад (із ключовими словами 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;
}