C#相当于VB.NET';我们什么时候赶上
在VB.NET中,我经常在时捕捉到C#相当于VB.NET';我们什么时候赶上,c#,vb.net,exception-handling,vb.net-to-c#,C#,Vb.net,Exception Handling,Vb.net To C#,在VB.NET中,我经常在时捕捉到 Try … Catch e As ArgumentNullException When e.ParamName.ToUpper() = "SAMPLES" … End Try 当时,是否有一个C#等价于捕获 如果可能的话,我不想在catch中使用if语句。在C#。您必须在catch中使用if语句,如果您的条件未满足,则重新调用: try { … } catch (ArgumentNullException e) { if ("
Try
…
Catch e As ArgumentNullException When e.ParamName.ToUpper() = "SAMPLES"
…
End Try
当时,是否有一个C#等价于捕获
如果可能的话,我不想在
catch
中使用if
语句。在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 When表达式。如果要在when过滤器处检查堆栈,实际上会看到引发异常的帧 在catch块中使用if是不同的,因为catch块在堆栈展开后执行。当涉及到错误报告时,这一点尤其重要。在VB场景中,您可以使用包含故障的堆栈跟踪崩溃。在C#中不可能得到这种行为 编辑:
写了一篇关于这个主题的文章。这个功能是为C#6发布的。现在可以写了
try { … }
catch (MyException e) when (myfilter(e))
{
…
}
您可以下载now的预览以查看此内容,或者等待正式发布。确定吗?你可以用“扔”而不是“扔e;”100%与投掷无关。执行when调用的表达式时。在VB中,当异常提升点仍在堆栈上时会发生异常。在c#中,即使堆栈已卸载,异常对象“e”仍然具有可用的堆栈跟踪。但它可能没有在调试时提供整个堆栈那么有用。但是对于运行时日志信息堆栈跟踪就足够了?除了调试(在C#中通过勾选“抛出异常时中断”复选框可以更容易地完成)之外,这还关系到是否运行“finally”子句。+1。Microsoft.net团队成员的博客文章的其他一些链接。Net CLR博客文章。也请查看此页;)我与cruizer和Nicholas Mancuso合作,只需使用“throw”即可保留堆栈@bob31334,仅保留异常对象中捕获的堆栈,但程序状态已被修改,原始堆栈已被销毁,最后块已执行(换句话说,当过滤器在catch语句级别而不是在处理程序中运行时,这类似于win32 API中的SEH)