Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#相当于VB.NET';我们什么时候赶上_C#_Vb.net_Exception Handling_Vb.net To C# - Fatal编程技术网

C#相当于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 ("

在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 ("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)