C# 通过catch块从函数返回,finally块会发生什么?

C# 通过catch块从函数返回,finally块会发生什么?,c#,exception-handling,return-value,try-catch-finally,C#,Exception Handling,Return Value,Try Catch Finally,我尝试了catch finally块,如果发生了一些异常,我将从catch块返回,所以finally块仍然被执行,如果是,什么时候?返回前还是返回后 这是正确的做法吗 try { // do something } catch (Exception) { return false; } finally { if (connection.State == ConnectionState.Open) connection.Close(); } 最后,始终执行块。在您的情况下,它在

我尝试了catch finally块,如果发生了一些异常,我将从catch块返回,所以finally块仍然被执行,如果是,什么时候?返回前还是返回后

这是正确的做法吗

try
{
// do something
}

catch (Exception)
{    
  return false;
}
finally
{
  if (connection.State == ConnectionState.Open) connection.Close();
}

最后,始终执行块。在您的情况下,它在return语句之前执行。

它将在return语句之后执行“finally”块。“Finally”用于一些实践,例如关闭数据库连接(始终需要完成)

您可以自己尝试

private bool test()
    {
        try
        {
            int i = 0;
           int u = 10 / i;
        }

        catch (Exception)
        {
            return false;
        }
        finally
        {

        }
        return true;
    }
因此,这是一个除以零的例外。当您执行此代码时,finally将执行,return之后将执行


这有点像运行时在最后阻塞的情况下返回的结果

最终块总是在代码退出try-catch-finally块之前执行(任何阻止最终块执行的条件,如ThreadAbortException,都会阻止代码退出try-catch-finally块)。

您可以发现是否在catch和finally?棘手的一行中都设置了断点。。。。。。我知道你可以运行它,看看会发生什么。如果你使用
using
,人们会认为不需要finally。using只能应用于实现IDisposable接口的实例,编译器会将using块转换为适当的try…finally块。编辑:将iClonable替换为IDisposable@Dialectus:这是一个合理的假设,因为使用的是语法糖,使得编译器使用
finally
块调用
Dispose
。@Dennis:这不是IDisposable吗?@Dennis:您知道不建议使用IClonable吗?请看这里:我认为finally在return语句之后执行,但在执行返回到调用函数之前执行。return->finally->go back。Debbuger首先转到return语句,然后再转到finally块。但是程序首先进入finally块,然后离开该方法。因此我可以合理地说,finally块是在return(离开method)语句之前执行的。C语言规范对事情发生的顺序非常清楚:1)计算
return
station中的表达式,2)执行
finally
块(对任何封闭的
try finally
块重复此操作),3)将控件返回给调用方。因此,
最后
是在计算
return
语句之后执行的,但在将控件返回给调用方之前执行的。@Fredrik:那应该是应答而不是注释。