Фильтр исключений С#?

Поддерживает ли С# компиляцию фильтров? Как работают фильтры или что они делают?

Как отражатель декомпилирует фильтр как

try
{
}
catch(Exception e) when (?)
{
}

Ответы

Ответ 1

С# не поддерживал фильтры исключений, такие как VB, до С# 6. Что касается того, как они работают, см. Eric Lippert "Наконец" не означает "немедленно"

Начиная с С# 6, поддерживаются фильтры исключений, поскольку часто задаваемые вопросы по С#:

try { … } 
catch (MyException e) when (myfilter(e)) 
{ 
    … 
}

Если выражение в скобках после 'if [now when] имеет значение true, блок catch запускается, в противном случае исключение продолжает двигаться.

Фильтры исключений предпочтительнее ловить и реконструировать, поскольку они оставляют стоп невредимым. Если последующее исключение вызывает сброс стека, вы можете увидеть, откуда оно взялось, а не только последнее место, которое оно было сброшено.

Это также распространенная и принятая форма "злоупотребления" для использования фильтров исключений для побочных эффектов; например Ведение журнала. Они могут проверять исключение, "пролетая", не перехватывая его курс. В таких случаях фильтр часто является вызовом вспомогательной функции ложного возврата, которая выполняет побочные эффекты:

private static bool Log(Exception e) { /* log it */ ; return false; }
…
try { … }
catch (Exception e) when (Log(e)) {}

Благодаря Mafii для ссылки на документацию на С# 6.

Ответ 2

С С# 6 вы можете это сделать.

try { … }
catch (MyException e) when (myfilter(e))
{
    …
}

Это отличается от использования оператора if из блока catch, при использовании фильтров исключений не будет раскручивать стек.

Ответ 3

Поддержка фильтров исключений в С# представлена ​​на С# 6 (Visual Studio "Dev14" ):

try
{
    throw new ApplicationException("1");
}
catch (ApplicationException ex) when (ex.Message == "2")
{
    // this one won't execute.
}
catch (ApplicationException ex) when (ex.Message == "1")
{
    // this one will execute
}

Ответ 4

единственный способ фильтрации - указать тип Exception более конкретный

например.

try
{
}
catch (ArgumentNullException)
{
   // specific exception
}
catch (Exception)
{
    // general exceptions
}

Ответ 5

Во время исключения исключений, если вы хотите обрабатывать исключения по-разному, вы можете использовать фильтр исключений
- после С# 6.0
- После VB 7.1 Использование WHEN

1) Образец С# после С# 6.0

try
{
    throw new CustomException { Severity = 100 };
}
catch (CustomException ex) when (ex.Severity > 50)
{
    Console.WriteLine("*BING BING* WARNING *BING BING*");
}
catch (CustomException ex)
{
    Console.WriteLine("Whooops!");
}

Примечание. Имейте в виду, что порядок

2) Образец С# перед С# 6.0

try
{
    throw new CustomException { Severity = 100 };
}
catch (CustomException ex)
{
   if (ex.Severity > 50)
    {
       Console.WriteLine("*BING BING* WARNING *BING BING*");
    }
   else
    {
       Console.WriteLine("Whooops!");
    }
}

Так как этот фрагмент кода эквивалентен предыдущему. означает, что они эквивалентны, правильно? --- " Но нет, они не эквивалентны"
ПРИМЕЧАНИЕ: фильтры исключений не разматывают стек

Подробнее читайте здесь