Фильтр when
В catch
можно добавить when (условие). Если
тип исключения подходит, но условие ложно,
этот обработчик пропускают и ищут следующий.
Так отбирают исключения по данным, не
раздувая число типов в catch.
Синтаксис
catch (Exception ex) when (условие)
{
}
Пример
Давайте поймаем исключение, когда длина
сообщения больше 3:
using System;
class Program
{
static void Main()
{
try
{
throw new InvalidOperationException("abcde");
}
catch (Exception ex) when (ex.Message.Length > 3)
{
Console.WriteLine("filtered");
}
}
}
Результат выполнения кода:
"filtered"
Пример
Давайте отклоним короткое сообщение фильтром и поймаем снаружи:
using System;
class Program
{
static void Main()
{
try
{
try
{
throw new InvalidOperationException("ab");
}
catch (Exception ex) when (ex.Message.Length > 3)
{
Console.WriteLine("inner");
}
}
catch (Exception)
{
Console.WriteLine("outer");
}
}
}
Результат выполнения кода:
"outer"
Пример
Давайте выведем сообщение при срабатывании фильтра:
using System;
class Program
{
static void Main()
{
try
{
throw new InvalidOperationException("abcde");
}
catch (Exception ex) when (ex.Message == "abcde")
{
Console.WriteLine(ex.Message);
}
}
}
Результат выполнения кода:
"abcde"