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

在VB.NET中我经常Catch…When

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

有没有C#等同于Catch…When

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

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

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

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

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

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

编辑:

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