Содержание
В прошлой статье мы рассмотрели вопросы перехвата и обработки исключений в 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 и обработать, например, определенный тип исключения.