分析try catch finally

By | 2013年12月25日

.net中利用异常机制来捕获错误或者异常信息。
在代码中尽量避免使用try-catch也是为了提升程序效率同时也使代码更加优化逻辑也更清晰。
try-catch 的使用一般是在代码中可能出错的位置使用。

关于try-catch-finally 的执行顺序,在不同的情景中也会有不同执行顺序。
try{} 代码块中包含可能出异常的代码.
catch{} 代码块用来捕获异常并进行处理的逻辑.
finally{} 一般用来释放资源使用,比如说try{} 中使用了非托管资源,finally{}就需要手动释放掉;这里需要注意的是,finally{}在代码中总会执行的,不论是否引发异常。

finally{}的执行有几种情况:
1. try{} 代码块中含有return 语句.
2. catch{}中含有return 语句.
3. finally{} 代码块的后面,函数体的末尾含有return 语句.
记住,finally{}一定会执行.对于1,2 中情况下,如果finally{} 对使用的变量或者资源进行操作并会影响函数最终的返回结果,因为在这2中情况下,finally{}的执行时间是在return 语句之后,函数返回之前,所以finally{}中对变量(或者返回结果)的操作 并不会影响函数的最终执行结果。

实例代码如下:

如上代码中,test2() 为一般使用方式,此时finally{}中进行修改变量a,会影响函数的最终返回结果,test2() 返回结果为:2.
test1() 代码中,因为return语句在catch{}中执行了,所以在函数返回前会执行finally{} 但是并会影响返回结果,test1{}返回结果为:1.

对于test1() 中的写法,为什么会返回1,不清除的同学可以将以上代码copy到 c#控制台程序中自己手动调试一下就会明白test1() 方法的执行顺序是: 先执行了catch{}中的return 语句后才执行的finally{}, 如下是test1() 的IL 反编译的代码.
IL_000x: 表示当前代码的执行顺序。

test1() IL代码

test1() IL代码

发表评论