在VB.NET中我经常 Catch…当

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

C#是否等同于 Catch…何时

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

有帮助吗?

解决方案

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

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

您可以下载 Visual Studio的预览2015年现在要检查这个,或者等待官方发布。

其他提示

在C#中没有等同于 Catch… 的时候。你将真的不得不求助于 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表达式在堆栈展开之前执行。如果要在过滤时检查堆栈,您实际上会看到抛出异常的帧。

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

编辑:

写了一篇有关该主题的详细博客文章

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top