Ответ 1
Функция фильтра исключений в С# 6.0 предоставляет различные преимущества. Здесь объяснение некоторых (упорядоченных по моей воспринимаемой важности)
-
Параметр четности. Исключительные фильтры уже были реализованы на уровне IL, а другие .Net-языки (VB.Net и F #) [1] и как часть создания нового компилятора для С# и VB.Net(проект "Roslyn" ) реализовано множество функций, существующих на одном языке и отсутствующих в другом. [2].
-
Crash Dumps. Исключительные фильтры не изменяют стек. это означает, что если он будет сброшен (в дампе сбоя), вы сможете узнать, откуда было изначально выбрано исключение, и не только там, где оно было сброшено (что не имеет отношения к реальной проблеме) [3]
-
Отладка. Когда исключение входит в блок
catch
, заново используется с помощьюthrow;
и не обрабатывается нигде в стеке (и настройки исключения устанавливаются для прерывания, когда исключение не обрабатывается пользователем) отладчик будет разбиваться наthrow;
вместо того, чтобы изначально было выбрано исключение (т.е. в приведенном ниже примере он разбился бы наthrow;
, а неthrow new FileNotFoundException();
) -
Несколько
catch
Блоки. Без фильтров исключений вы должны поймать исключение, проверить условие и если оно не выполненоthrow;
исключение. Исключенное исключение не рассматривает другие блокиcatch
, даже если исключение удовлетворяет всем условиям, которые в конечном итоге приводят к одному большому блокуcatch
try { throw new FileNotFoundException(); } catch (FileNotFoundException e) { if (!e.FileName.Contains("Hamster")) { throw; } // Handle } catch (Exception e) { // Unreachable code }
-
Считываемость. Хотя вы могли бы использовать блок "catch all"
catch
со многими условиями иthrow;
, когда они не выполняются (при переносе изменений в стек), это гораздо четче иметь отдельные и различные блокиcatch
, где каждый обрабатывает определенную проблему соответствующим образом:try { } catch (Win32Exception exception) when (exception.NativeErrorCode == 0x00042) { } catch (Win32Exception exception) when (exception.NativeErrorCode == 0x00011) { } catch (IOException) { }
-
"Злоупотребление" . Вы можете использовать фильтры исключений в качестве способа проверки исключения без его обработки. Хотя это не главное преимущество, это хороший побочный эффект. У вас может быть ложный возвращаемый метод ведения журнала и пустой блок
catch
:private static bool LogException(Exception exception) { Console.WriteLine(exception.Message); return false; } try { } catch (ArgumentException exception) when (LogException(exception)) { // Unreachable code. }
В заключение, большинство функций С# 6.0 - это небольшие улучшения и синтаксический сахар, а в то время как фильтры исключений - не очень большая функция, она предоставляет функциональность, которая была невозможна раньше.
-
Предварительный просмотр языка С# 6.0
Другое исключение в С# 6.0 для поддержки фильтров исключений - обновляет язык с другими языками .NET, а именно Visual Basic.NET и F #
-
Фильтры исключений предпочтительнее ловить и реконструировать, поскольку они оставляют стоп невредимым. Если последующее исключение вызывает сброс стека, вы можете увидеть, откуда оно взялось, а не только последнее место, которое оно было сброшено.