C# эквивалентно VB.NET Catch... Когда
В VB.NET я часто Catch…When
:
Try
…
Catch e As ArgumentNullException When e.ParamName.ToUpper() = "SAMPLES"
…
End Try
Есть ли C# эквивалент Catch…When
?
Я не хочу прибегать к использованию if
заявление внутри catch
если возможно.
3 ответа
Эта функциональность была анонсирована для C# 6. Теперь можно написать
try { … }
catch (MyException e) when (myfilter(e))
{
…
}
Вы можете скачать предварительный просмотр Visual Studio 2015 прямо сейчас, чтобы проверить это, или дождаться официального релиза.
Там нет эквивалента Catch…When
в C#. Вам действительно придется прибегнуть к 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 выполняется до того, как происходит раскрутка стека. Если бы вы исследовали стек в точке когда фильтр, вы бы фактически увидели кадр, в который было сгенерировано исключение.
Наличие if в блоке catch отличается от того, что блок catch выполняется после разматывания стека. Это особенно важно, когда дело доходит до сообщений об ошибках. В сценарии VB у вас есть возможность сбоя с трассировкой стека, включая сбой. Невозможно получить такое поведение в C#.
РЕДАКТИРОВАТЬ:
Написал подробный пост в блоге на эту тему.