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

Fun*_*ung 14 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
Run Code Online (Sandbox Code Playgroud)

是否有C#相当于Catch…When

如果可能ifcatch话,我不想诉诸于使用声明.

cru*_*zer 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
    } 
}
Run Code Online (Sandbox Code Playgroud)

  • 我正在使用巡洋舰和Nicholas Mancuso,只需使用'throw'保留堆栈[错误每个C#程序员制作](http://msmvps.com/blogs/nickwienholt/archive/2006/07/04/103778.aspx"每个C#程序员的错误都会产生") (2认同)

Joe*_*Joe 13

这个功能是为C#6宣布的.现在可以写了

try { … }
catch (MyException e) when (myfilter(e))
{
    …
}
Run Code Online (Sandbox Code Playgroud)

您现在可以下载Visual Studio 2015的预览版以查看它,或者等待官方发布.


Jar*_*Par 12

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

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

编辑:

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