C# 等同于 VB.网的收获..什么时候

本文关键字:收获 什么时候 等同于 VB | 更新日期: 2023-09-27 17:47:21

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

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

是否有等效于Catch…When的 C#?

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

C# 等同于 VB.网的收获..什么时候

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

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

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

在 C# 中没有等效的 Catch…When。你真的必须在你的catch中求助于一个if语句,然后在你的条件不满足时重新抛出:

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 Filter 点检查堆栈,您实际上会看到引发异常的帧。

在 catch 块

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

编辑:

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