Вопрос

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

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

Существует ли C # эквивалент Catch…When?

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

Это было полезно?

Решение

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

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

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

Другие советы

В C # нет эквивалента Catch & # 8230; 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
    } 
}

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

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

Редактировать:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top