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语句。