在 VB.NET 中,我经常Catch…When
:
Try
…
Catch e As ArgumentNullException When e.ParamName.ToUpper() = "SAMPLES"
…
End Try
是否有相当于的 C# Catch…When
?
如果可能的话,我不想诉诸if
在 a 中使用语句catch
。
在 VB.NET 中,我经常Catch…When
:
Try
…
Catch e As ArgumentNullException When e.ParamName.ToUpper() = "SAMPLES"
…
End Try
是否有相当于的 C# Catch…When
?
如果可能的话,我不想诉诸if
在 a 中使用语句catch
。
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
}
}
此功能是针对 C# 6 宣布的。现在可以编写
try { … }
catch (MyException e) when (myfilter(e))
{
…
}
您现在可以下载Visual Studio 2015的预览版来查看它,或者等待正式发布。
这不会重新创建与 VB Catch When 表达式相同的语义。有一个关键区别。VB When 表达式在堆栈展开发生之前执行。如果您要在 when Filter 的位置检查堆栈,您实际上会看到引发异常的帧。
在 catch 块中有 if 是不同的,因为 catch 块在堆栈展开后执行。当涉及到错误报告时,这一点尤其重要。在 VB 场景中,您可以使用包括故障在内的堆栈跟踪崩溃。在 C# 中无法获得这种行为。
编辑:
写了一篇关于这个主题的详细博客文章。