C # эквивалентно VB.NET Catch ... Когда - PullRequest
13 голосов
/ 08 октября 2008

В VB.NET я часто Catch…When:

Try
    …
Catch e As ArgumentNullException When e.ParamName.ToUpper() = "SAMPLES"
    …
End Try

Есть ли C #, эквивалентный Catch…When?

Я не хочу прибегать к использованию оператора if внутри catch, если это возможно.

Ответы [ 3 ]

15 голосов
/ 08 октября 2008

Нет эквивалента 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
    } 
}
12 голосов
/ 09 апреля 2014

Эта функциональность была анонсирована для C # 6. Теперь возможно написать

try { … }
catch (MyException e) when (myfilter(e))
{
    …
}

Вы можете скачать предварительный просмотр Visual Studio 2015 сейчас, чтобы проверить это, или дождаться официального релиза.

12 голосов
/ 08 октября 2008

Это не будет воссоздавать ту же семантику, что и выражение VB Catch When. Есть одно ключевое отличие. Выражение VB When выполняется до того, как размотка стека произойдет. Если бы вы исследовали стек в точке когда фильтр, вы бы фактически увидели кадр, в который было сгенерировано исключение.

Наличие if в блоке catch отличается от того, что блок catch выполняется после разматывания стека. Это особенно важно, когда дело доходит до сообщений об ошибках. В сценарии VB у вас есть возможность сбоя с трассировкой стека, включая сбой. Невозможно получить такое поведение в C #.

EDIT:

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

...