14

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

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

是否有相当于的 C# Catch…When

如果可能的话,我不想诉诸if在 a 中使用语句catch

4

3 回答 3

15

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
    } 
}
于 2008-10-08T03:07:20.757 回答
14

此功能是针对 C# 6 宣布的。现在可以编写

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

您现在可以下载Visual Studio 2015的预览版来查看它,或者等待正式发布。

于 2014-04-09T10:14:16.870 回答
12

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

在 catch 块中有 if 是不同的,因为 catch 块在堆栈展开后执行。当涉及到错误报告时,这一点尤其重要。在 VB 场景中,您可以使用包括故障在内的堆栈跟踪崩溃。在 C# 中无法获得这种行为。

编辑:

写了一篇关于这个主题的详细博客文章

于 2008-10-08T03:51:00.730 回答