C # эквивалентно улову VB.NET ... Когда
-
05-07-2019 - |
Вопрос
В VB.NET Я часто Catch…When
:
Try
…
Catch e As ArgumentNullException When e.ParamName.ToUpper() = "SAMPLES"
…
End Try
Существует ли C # эквивалент Catch…When
?
Я не хочу прибегать к использованию if
оператор внутри catch
если это возможно.
Решение
Эта функциональность была анонсирована для C # 6. Теперь можно писать
try { … }
catch (MyException e) when (myfilter(e))
{
…
}
Вы можете загрузить предварительный просмотр Visual Studio 2015 , чтобы проверить это или дождаться официального релиза.
Другие советы
В C # нет эквивалента Catch & # 8230; When
. Вам действительно придется прибегнуть к выражению if
внутри catch
, а затем перебросить, если ваше условие не выполнено:
try
{
…
}
catch (ArgumentNullException e)
{
if ("SAMPLES" == e.ParamName.ToUpper())
{
… // handle exception
}
else
{
throw; // condition not fulfilled, let someone else handle the exception
}
}
Это не воссоздаст ту же семантику, что и выражение VB Catch When.Есть одно ключевое отличие.Выражение VB When выполняется до того, как произойдет размотка стека.Если бы вы проверили стек в точке фильтра when, вы бы на самом деле увидели фрейм, в котором было сгенерировано исключение.
Наличие if в блоке catch отличается тем, что блок catch выполняется после разматывания стека.Это особенно важно, когда дело доходит до отчетов об ошибках.В сценарии VB у вас есть возможность сбоя с трассировкой стека, включая сбой.Добиться такого поведения в C # невозможно.
Редактировать:
Написал подробный пост в блоге по этому вопросу.