C#等同于VB.NET的Catch…When

问题描述 投票:14回答:3

在VB.NET中,我经常Catch…When

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

是否有C#等于Catch…When

如果可能,我不想在if中使用catch语句。

c# vb.net exception-handling vb.net-to-c#
3个回答
14
投票

此功能已在C#6中宣布。现在可以编写

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

您现在可以下载Visual Studio 2015的预览以进行检查,或等待正式发布。


15
投票

[C#中没有与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
    } 
}

12
投票

不会重新创建与VB Catch When表达式相同的语义。有一个关键的区别。在堆栈展开之前执行VB When表达式。如果要在when过滤器的时刻检查堆栈,则实际上会看到引发异常的帧。

在catch块中具有if的情况是不同的,因为在展开堆栈之后执行catch块。当涉及错误报告时,这一点尤其重要。在VB方案中,您可以使包含故障的堆栈跟踪崩溃。在C#中无法获得该行为。

编辑:

在主题上写了detailed blog post

© www.soinside.com 2019 - 2024. All rights reserved.