Фильтры исключений в C#

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

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии