经过长时间的资料查阅,终于找到一篇说得简单易懂一目了然的文章把这个问题说清楚了。分享出来给大家。
原文网址:当C#中带有return的TryCatch代码遇到Finally时代码执行顺序
编写的代码最怕出现的情况是运行中有错误出现,但是无法定位错误代码位置。综合《C#4.0图解教程》,总结如下:
TryCatchFinally用到的最多的是TryCatch,Catch可以把Try代码块的错误捕捉到,并对错误进行后续处理。这一点比较常见。
现在要讨论的是如果Try和Catch代码块有return时代码的执行顺序。众所周知,return的作用是退出当前函数,不执行return后面的代码。那么问题来了:如果return出现在Try或catch代码块中,并且return后面还有代码,则return后面的代码将不再执行,程序直接退出这个函数。假如我们在这个函数中有一些代码无论何种情况下都是必须要执行(比如ADO.Net中的数据库连接,为保证稳定,即使代码出现异常也需要通过代码强制关闭该连接),那么简单的TryCatch就不能很好的满足需求了。此时Finally代码块的作用就显现出来了。
《C#4.0图解教程》中讲到,Finally代码块的优先级比较高,不论TryCatch代码块如何运行,最后都要执行Finally代码块。即使Try和Catch中有return也无妨。
直接上图,具体的代码执行顺序在图中标注的比较清楚。
return出现在Catch中
return出现在Try中
感谢原文作者!
补充说明
对于嵌套的try,每个try中的finally中的代码,在return后都会执行。如下代码中,“错误处理代码1”和“错误处理代码2”均会被执行。
try
{
try
{
//你的过程代码
return;
}
catch(Exception ex)
{
//错误处理代码1
return;
}
finally
{
//必执行代码1
}
}
catch(Exception ex)
{
//错误处理代码2
return;
}
finally
{
//必执行代码2
}