CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  .NET Framework

finally语句存在有何理由?

楼主chenyuming2004(这辈子我算是废了)2004-05-03 21:37:49 在 .NET技术 / .NET Framework 提问

try  
  {  
  }  
  catch  
  {  
  }  
  finally  
  {  
  }  
   
  如果try中的语句执行没出错,执行完后  
  执行finally中的语句,如果有错执行catch中的语句  
  再执行finally中的语句?  
   
  为什么要这么做呢?  
  如果finally语句只是我上述所说的功能完全可以去掉啊?  
  只保留try{},catch{}语句,  
  反正它都是在try和catch执行完后再执行,  
  我在这两个语句下面写跟在finally中写  
  有什么区别? 问题点数:20、回复次数:28Top

1 楼Yok(黄旭)回复于 2004-05-03 21:48:48 得分 0

finally能保证他被执行  
  try里面任何跳转语句都不能阻止finally被执行Top

2 楼lxcc()回复于 2004-05-03 22:01:07 得分 0

finally保证出错后能做一些善后工作Top

3 楼chenyuming2004(这辈子我算是废了)回复于 2004-05-03 22:08:57 得分 0

Yok(黄旭)   (   )    
  finally能保证他被执行  
  try里面任何跳转语句都不能阻止finally被执行  
   
  的意思是不是说在try或catch里面即使有goto或return等语句,  
  也会执行完finally后才会跳转?Top

4 楼erictang2003()回复于 2004-05-03 22:16:51 得分 0

最有用的是,即使抛出异常,仍然可以在finally中  
  ->   关闭数据库连接,  
  ->   清理占用资源Top

5 楼byx45(byx45)回复于 2004-05-03 22:54:46 得分 0

1、在catch语句里可能有Return语句,这种情况下,finally的语句也会先执行,再跳回。  
  2、正常情况下,没有return的话,语句会顺序的执行。但很多情形,发生异常需要跳出当前的方法。Top

6 楼SimerJoe(浪月)回复于 2004-05-04 08:54:10 得分 0

如果需要关闭数据库。文件。网络的连接finally是最合适的。  
  不管是否出错,它都会执行。Top

7 楼Yok(黄旭)回复于 2004-05-04 19:11:20 得分 1

>>的意思是不是说在try或catch里面即使有goto或return等语句,  
  >>也会执行完finally后才会跳转?  
  对.除非在finally又出现了异常  
  Top

8 楼zag(智格)回复于 2004-05-04 19:26:31 得分 1

finally语句中可执行catch之后的语句,也就是说即使发生异常也能执行。这对于一些资源的即时释放是很有帮助的。Top

9 楼musicllm(编程雨生)回复于 2004-05-04 20:05:13 得分 1

你return试试Top

10 楼yzx110(原振侠)回复于 2004-05-05 13:03:09 得分 1

实际上有些地方看起来确实没必要用finally  
   
  但是如果你写一个API,这个API需要用到一些非托管资源,又可能抛出异常,这时候finally就有用了  
   
  比如try{}   finally{},如果有异常抛出finally就可以清理资源,并且这个API的外部能够准确捕获到这个异常,如果你只用try{}catch{}的话,你虽然能够清理资源,但却不能正确把情况反映给用户(虽然你可以再次throw,但这是不是增加了编程的负担?)。Top

11 楼chenyu001(天使之恋)回复于 2004-05-05 22:25:38 得分 1

finally   主要是做一些善后工作的  
   
  在一般的操作中   本人是很少用到Top

12 楼Sunmast(速马@Redmond, WA)回复于 2004-05-05 22:31:01 得分 0

主要用于减少重复代码  
  比如你打开了一个FileStream   fs  
  如果不用finally{}的那应该就是  
  try  
  {  
  ...  
  fs.Close();  
  }  
  catch  
  {  
  ...  
  fs.Close();  
  }  
  这样才能保证stream总是关闭  
   
  但是如果用finally  
  那就是  
  try  
  {  
  ...  
  }  
  catch  
  {  
  ...  
  }  
  finally  
  {  
  fs.Close();  
  }  
  这样省得写两次fs.Close();  
  实际情况可能更为复杂  
  使用finally{}可以把最后处理现场的代码写到一起,清晰而易于维护Top

13 楼Ninputer(装配脑袋)回复于 2004-05-07 14:18:39 得分 0

finally很少和catch一起出现,因此一旦他们同时出现,要么是一种高级设计,要么是不良设计。  
   
  如果没有catch,只有finally,那么finally的作用是十分明显的!你自己思考看看。Top

14 楼outrace(欧阳云天)回复于 2004-05-07 14:26:41 得分 1

to   Ninputer(装配脑袋)  
  为什么说“一旦他们同时出现,要么是一种高级设计,要么是不良设计。”  
  主要是为什么是不良设计  
   
  个人感觉  
  try  
  {  
  ...  
  }  
  catch  
  {  
  ...  
  }  
  finally  
  {  
  …  
  }  
  是对所有有可能产生错误的地方的标准眶架。  
  怎么会没有用呢?Top

15 楼huangsuipeng(hsp|I love foxpig)回复于 2004-05-07 14:33:33 得分 0

大家都说了呢Top

16 楼vzxq(灵感人)回复于 2004-05-07 17:47:56 得分 1

这也不明白,如果没有finally   出错后,就停止运行程序了,这样一些连接得不到释放。Top

17 楼Ninputer(装配脑袋)回复于 2004-05-08 19:59:57 得分 0

我是以实际经验而言,因为如果所有的异常都被Catch,Finally那里的代码即时放到try块外部也会被执行,如  
  try{  
   
  }  
  catch(Exception){  
   
  }  
  finally   {  
          //这里的代码放一个finally块和没放一个样!  
  }  
   
  但如果没有catch,那么finally块的作用非常明了:  
   
  try{  
          //code   here  
   
  }  
  finally{  
          //若Try部分发生了异常,控制权就会向外抛出,但无论抛到哪里  
          //这里的代码始终会被执行。  
  }  
   
   
   
   
  Top

18 楼Ninputer(装配脑袋)回复于 2004-05-08 20:03:18 得分 0

总之,catch(Exception)这种语句和finally一起出现一眼就可以看出是个不良设计。实际上,catch和finally只有很少情况需要同时出现,而当那个catch只能捕获有限异常或者Try块中有其他跳转语句才需要Catch和try同时出现。Top

19 楼Sunmast(速马@Redmond, WA)回复于 2004-05-08 23:22:17 得分 0

-->   catch(Exception)这种语句和finally一起出现一眼就可以看出是个不良设计  
  不同意  
  事实上很多情况都是需要的  
  看我上面那个帖子Top

20 楼Ninputer(装配脑袋)回复于 2004-05-08 23:30:44 得分 0

你那个例子如果将fs.Close()移到try块的外边也一样会执行啊。如果不发生跳转,finally的作用就体现不出来了。Top

21 楼cuijie(cuijie)回复于 2004-05-09 06:19:21 得分 0

有道理,顶Top

22 楼Sunmast(速马@Redmond, WA)回复于 2004-05-09 11:55:20 得分 2

fs.Close()放到外面..   有些情况是不行的  
  有两种情况  
  一个是try{}catch{}里面函数已经return  
  一个是catch{}内部可能被设计为再次抛出异常  
   
  当然,不过不是这种情况,就无所谓了  
  但是我还是偏向于使用finally{}  
  这样子代码更为清晰Top

23 楼Ninputer(装配脑袋)回复于 2004-05-09 12:14:15 得分 2

是啊,return也属于跳转语句,还有goto,出错的代码以及throw等,如果要使用他们,还有必需要执行的代码,就应当使用finally了。Top

24 楼gcs925(竹里坐消无事福,花间补读未完书)回复于 2004-05-09 13:33:07 得分 0

学习Top

25 楼soulroom(易水之风)回复于 2004-05-09 15:00:41 得分 1

finally比catch用的更多Top

26 楼lkal4587()回复于 2004-05-10 22:52:25 得分 1

有些东西   不管   是否发生异常   都要执行呀  
   
  Top

27 楼greatsft(C的使者)回复于 2004-05-11 15:06:04 得分 7

1:finally的作用就是你说.当然完全不用finally语句可以吗?有些情况下当然可以,可是  
  作为一个好的习惯就应该习惯使程序有专业性和完整性.  
        为什么说是有些情况下呢?比如说一个打开数据库方法:  
        void   OpenDB(){  
              SqlConnection   conn=new   SqlConnection(conn_string);  
              try{  
                    conn.Open();  
                    SqlCommand   comm=new   SqlCommand();  
                    ...  
                    ...  
                    conn.close();  
                  }  
              catch(Exception   ee){  
                    MessageBox.Show(ee.Message);  
                  }  
              }  
          可是如果在conn.Open()语句后处出现异常,那么直接跳到catch中,  
            这样就没有办法执行conn.Close();使资源得不到释放!!没有意义!!  
     
          相反,如果在后面加上finnally{conn.close()}  
          那么无论是否运行正常,都将关闭与数据库的连接,释放了部分资源!!  
   
        所以很明显可以看出finally还是很有必要的!  
   
                                                                                                        wish   u   good   luck  
                                                                                                                    GreatsftTop

28 楼haohaohaohao()回复于 2004-05-12 08:34:11 得分 0

学习中,实在长见识啊!!Top

相关问题

  • 请教finally语句
  • 请教finally语句
  • SQL语句无法运行是否存在问题?
  • 关于sql语句中存在text空间的问题
  • sql语句如何判断表是否存在某个字段
  • 执行语句判断记录是否存在的问题!
  • 求教判断临时表存在的SQL语句。。。。急
  • 如何用SQL语句判断某张表是否存在?
  • 存储过程中可否存在if语句?
  • 你存在的理由?!

关键词

  • 语句
  • 执行
  • 代码
  • 数据库
  • 连接
  • finally
  • catch
  • 异常
  • 抛出
  • try

得分解答快速导航

  • 帖主:chenyuming2004
  • Yok
  • zag
  • musicllm
  • yzx110
  • chenyu001
  • outrace
  • vzxq
  • Sunmast
  • Ninputer
  • soulroom
  • lkal4587
  • greatsft

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo