Содержание
В прошлой статье мы рассмотрели вопросы перехвата и обработки исключений в C#. Вместе с этим обработка исключений в C# может быть ещё более гибкой, чем рассмотренная ранее. Так, забегая немного вперед, скажу, что в C# при обработке исключений также возможно использование фильтров. И сегодня мы рассмотрим один из примеров их использования.
Фильтры исключений в C#
Фильтры исключений позволяют обрабатывать или не обрабатывать тот или иной тип исключений в зависимости от определенных условий. Например, возьмем код перехвата и обработки исключений из предыдущей статьи:
try { if (int.TryParse(Console.ReadLine(), out i)) { y = x / i; Console.WriteLine($"{x}/{i}={y}"); } else { Console.WriteLine("Вы ввели не число!"); } } catch (System.OverflowException e) { Console.WriteLine($"Введите число в диапазоне от {int.MinValue} до {int.MaxValue}, исключая ноль. Исключение {e}"); } catch (System.DivideByZeroException e) { Console.WriteLine($"Деление на ноль! Исключение {e}"); }
Здесь у нас в catch
обрабатываются исключения типа OverflowException
и DivideByZeroException
, а попытка ввести не целое число, а, например, строку отсекается путем использования обычного условного оператора if
. Применим фильтр исключений и перепишем блоки с DivideByZeroException
следующим образом:
catch (System.DivideByZeroException e) when (x==0 && i==0) { Console.WriteLine($"Оба числа равны нулю! Исключение {e.Message}"); } catch (System.DivideByZeroException e) { Console.WriteLine($"Деление на ноль! Исключение {e}"); }
здесь мы в первом блоке catch
применили фильтр, используя ключевое слово when
. После when
в круглых скобках указано логическое выражение. Если логическое выражение равно true
, то блок catch
обрабатывается, иначе — ищется следующий блок catch
в котором можно обработать исключение.
Строго говоря, если нас не интересует какая-либо дополнительная информация об исключении, то имя переменной с которой будет сопоставлен тип исключения можно опускать и сделать обработку, например, так:
catch (DivideByZeroException) when (x==0 && i==0) { Console.WriteLine("Оба числа равны нулю!"); }
Итого
Фильтры исключений позволяют сделать обработку исключений в C# более гибкой. Используя ключевое слово when
можно определить логическое выражение истинный результат которого (true
) позволяет зайти внутрь блока catch
и обработать, например, определенный тип исключения.