关于finally的一些认知

来源:互联网 发布:nginx 使用内存缓冲 编辑:程序博客网 时间:2024/05/17 04:08

简介:相信大家在开发中都能使用很好的处理异常,那么避免不了和try catch finally 接触,慢慢的发现了下面的几个问题,开发环境是vs2010 +reshaper,当你想使用代码块时,智能提示会提示try和tryf两种,那么这两种代码块有什么样的区别那,还有就是c#中的return是结束当前执行的方法,那么如果我们在使用try catch finally时,在try代码块和catch代码块中都return;一下,那么finally中的代码还会执行吗,如果执行的话,如果return 后面是调用一个方法,那么return后面的方法中的代码和finally中的代码那个先执行那,下面带着这两个问题,我们来弄两个小例子

1.第一个例子,来说明try ,tryf的区别

当我们键入try 回车时,vs会添加以下代码,

try
            {


            }
            catch (Exception)
            {
                
                throw;
            }

上面的这种方式,主要适用于处理托管资源的异常处理,不需要在finally中关闭连接等操作

当我们键入tryf 回车时,vs会添加以下代码

  try
            {


            }
            finally
            {
                
            }

那么这种异常处理,适用于哪种情况那,按说出现了finally应该是用来释放占用资源的处理吧,可这种方式,真的能释放资源吗,答案是否定的


我认为智能提示的作用是用来提高开发人员的额开发效率的,但是如果提示的代码块可能包含某些可能存在的错误的话,这种智能提示还是不要有的好,因此,我们也可以总结出,在c#的开发中如果我们要使用异常处理,有以下两种参考方式,

try
            {


            }
            catch (Exception)
            {
                
                throw;
            }

或者

try
            {


            }
            catch (Exception e)
            {


            }
            finally
            {


            }

前一种解决是托管资源的异常,后一种解决是非托管资源的异常,第一个?,就到这里吧,多说一句,之所以会出现上面的疑问,大家自己可以尝试着上面3种可能的异常处理多级嵌套试试,就知道为什么建议用后两种方式了

2.第二个例子

首先我们先来解决第一个疑问,

上代码



从上面2个图可知,try,catch中return了,finally中的代码执行了,第一个小疑问,解决,注意finally中是不允许出现return的,编译都通不过,

再多想一个问题,如果代码修改如下:


可以看出try,catch中的return对finally中的代码的执行时没有影响的,但是对后面的代码时起作用的

接下来,我们解决第二个小疑问

代码


从图中看出现执行了return 后的testvoid方法,后自行了finally中的代码,第二个问题解决

0 0
原创粉丝点击