在VB.NET中,我经常Catch…When
:
Try
…
Catch e As ArgumentNullException When e.ParamName.ToUpper() = "SAMPLES"
…
End Try
是否有C#等于Catch…When
?
如果可能,我不想在if
中使用catch
语句。
此功能已在C#6中宣布。现在可以编写
try { … }
catch (MyException e) when (myfilter(e))
{
…
}
您现在可以下载Visual Studio 2015的预览以进行检查,或等待正式发布。
[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
}
}
不会重新创建与VB Catch When表达式相同的语义。有一个关键的区别。在堆栈展开之前执行VB When表达式。如果要在when过滤器的时刻检查堆栈,则实际上会看到引发异常的帧。
在catch块中具有if的情况是不同的,因为在展开堆栈之后执行catch块。当涉及错误报告时,这一点尤其重要。在VB方案中,您可以使包含故障的堆栈跟踪崩溃。在C#中无法获得该行为。
编辑:
在主题上写了detailed blog post。