С# эквивалентен 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:

Написал подробное сообщение в блоге по этому вопросу.