Фильтр исключений С#?
Поддерживает ли С# компиляцию фильтров? Как работают фильтры или что они делают?
Как отражатель декомпилирует фильтр как
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!");
}
}
Так как этот фрагмент кода эквивалентен предыдущему. означает, что они эквивалентны, правильно? --- " Но нет, они не эквивалентны"
ПРИМЕЧАНИЕ: фильтры исключений не разматывают стек
Подробнее читайте здесь