C# try-catch-finally 的finally的作用是什么?

try块包含可能出现异常的代码,出现异常后try块剩余代码不再执行。

catch块用来捕捉异常。catch块可以有多个,通过在catch后加括号(里面的参数写异常的类型)来指定异常的类型,不加括号或者括号里写Exception表示捕捉所有异常。当try块代码发生异常时,程序会根据异常的类型执行第一个符合条件的catch块,如果没找到的话程序会中止并报错。

finally块在所有catch块的后面,包含了始终会执行的代码,准确来说是只要程序没中止就会执行(如果没有符合条件的catch块程序就会中止,finally块也不执行)。finally块代码主要用来释放资源,比如:I/O缓冲区,数据库连接。

最后,如果没有未经处理的异常,代码继续向下运行。

 

 

但是!我一直有个疑问

try
{
    doSomething();
}
catch
{
    catchSomething();
}
finally
{
    alwaysDoThis();
}
try
{
    doSomething();
}
catch
{
    catchSomething();
}

alwaysDoThis();

上面两段代码无论try块有没有出现异常,执行的结果都是一样的吧?finally好像有点鸡肋了。

 

现在我终于找到了答案

主要是考虑到try和catch中包含return的情况

如果try中出现了异常,catch中有return的话,在finally中的语句仍然会执行,finally之后的不会执行。

如果try中没有异常,try中有return的话,在finally中的语句还是会执行,finally之后的不会执行。

参考链接:https://stackoverflow.com/questions/547791/why-use-finally-in-c

 

PS:当try、catch中有return时,finally中的代码依然会继续执行,finally是在return后面的表达式运算之后执行的,此时函数并没有返回,而是把返回值保存起来。不管finally对return的变量值做任何的改变,函数的返回值都不会改变。

有博文说finally代码中最好不要包含return,程序会提前退出,也就是说返回的值不是try或catch中的值。这可能是其他语言的情况。

经过测试,C#的finally块不允许有return语句。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值