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#.

РЕДАКТИРОВАТЬ:

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

Другие вопросы по тегам