在VB.NET中我常常Catch…When
:
Try
…
Catch e As ArgumentNullException When e.ParamName.ToUpper() = "SAMPLES"
…
End Try
C#是否等同于Catch…When
?
如果可能的话,我不想在if
内使用catch
语句。
答案 0 :(得分:15)
C#中没有等同于Catch…When
的内容。您必须在if
内使用catch
声明,然后重新抛出,如果您的情况未得到满足:
try
{
…
}
catch (ArgumentNullException e)
{
if ("SAMPLES" == e.ParamName.ToUpper())
{
… // handle exception
}
else
{
throw; // condition not fulfilled, let someone else handle the exception
}
}
答案 1 :(得分:12)
这不会重新创建与VB Catch When表达式相同的语义。有一个关键的区别。 VB表达式在堆栈展开之前执行。如果要在过滤时检查堆栈,您实际上会看到抛出异常的帧。
在catch块中有一个if是不同的,因为catch块在解除堆栈后执行。这在错误报告方面尤为重要。在VB场景中,您可以使用包括故障在内的堆栈跟踪进行崩溃。在C#中无法获得该行为。
编辑:
在这个问题上写了detailed blog post。
答案 2 :(得分:12)
此功能已针对C#6发布。现在可以编写
try { … }
catch (MyException e) when (myfilter(e))
{
…
}
您现在可以下载Visual Studio 2015的预览来查看,或等待官方发布。