C#相当于VB.NET的Catch ......当

时间:2008-10-08 03:04:59

标签: c# vb.net exception-handling vb.net-to-c#

在VB.NET中我常常Catch…When

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

C#是否等同于Catch…When

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

3 个答案:

答案 0 :(得分: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
    } 
}

答案 1 :(得分:12)

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

在catch块中有一个if是不同的,因为catch块在解除堆栈后执行。这在错误报告方面尤为重要。在VB场景中,您可以使用包括故障在内的堆栈跟踪进行崩溃。在C#中无法获得该行为。

编辑:

在这个问题上写了detailed blog post

答案 2 :(得分:12)

此功能已针对C#6发布。现在可以编写

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

您现在可以下载Visual Studio 2015的预览来查看,或等待官方发布。