C# 通过catch块从函数返回,finally块会发生什么?
我尝试了catch finally块,如果发生了一些异常,我将从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(); } 最后,始终执行块。在您的情况下,它在
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:那应该是应答而不是注释。