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