CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
(图)邪恶的韩国UMPC 使用 Java 编写数据库应用新规范
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C++ Builder >  基础类

[讨论]从Delphi 里面带过来的 __finally 关键字是否多余?

楼主deavilness(俠盜裸奔漢)2003-02-03 17:13:59 在 C++ Builder / 基础类 提问

偶觉得这个   __finally   有些多余,看一下下面的结构:  
   
  TMyClass   *p   ;  
   
  try   {  
      p   =   new   TMyClass   ;  
      ...  
  }   catch(...)   {  
      ...  
  }  
   
  delete   p   ;  
   
  在这里,无论   catch   是有执行还是没有执行,delete   p   还是一个样的执行,这个好象跟   __finally   的作用一样。除非是在   try   内部有些错误导致程序无法向下执行,但如果真有这种错误,__finally   似乎也不能幸免。  
   
  所以偶觉得   __finally   有些多余,不知道俺的想发是否正确,请各位大侠来指点指点。 问题点数:0、回复次数:19Top

1 楼TR@SOE()回复于 2003-02-03 17:17:18 得分 0

我是这么认为的,  
   
  标准的C++里好象是没有__finally的,但是有了它确实很好。Top

2 楼duduwolf(嘟嘟狼)回复于 2003-02-03 17:26:25 得分 0

gzTop

3 楼ilikeff8(迷茫)回复于 2003-02-03 18:14:53 得分 0

给你举个例子,当然你可以不这么做,但这样结构更好  
  procedure   TForm1.Test;  
  var  
      i:real;  
      Edit:TEdit;  
  begin  
      Edit:=TEdit.Create(nil);  
      try  
          try  
              begin  
                  Edit.Text:='0';  
                  i:=1/StrToInt(Edit.Text);  
              end;  
          finally  
              Edit.Free;  
          end;  
      except  
          on   Exception   do  
              begin  
                  ShowMessage('wrong');  
                  Exit;  
              end;  
      end;  
      ShowMessage('right');  
  end;  
   
  Top

4 楼ilikeff8(迷茫)回复于 2003-02-03 18:15:31 得分 0

忘了写成bcb的,反正看得懂Top

5 楼langhaixin(C++如此多娇,引无数高手尽折腰!)回复于 2003-02-03 22:04:29 得分 0

同感ing   觉得finally   没有多少实用,Top

6 楼warton(创业群13734424 http://www.anywhy.cn)回复于 2003-02-04 12:51:29 得分 0

to   ilikeff8(迷茫)   你的程序这样处理异常并不可取,记得csdn有篇文章,讲eiffel的异常的,我觉得不错,你们看看Top

7 楼oyxiaoyu0(小雨仔)回复于 2003-02-04 13:25:13 得分 0

交给CPU处理Top

8 楼cupidvenus(小鱼儿)回复于 2003-02-04 13:47:22 得分 0

否Top

9 楼meCAD(重建CHINABCB.COM论坛(QQ群:13252194))回复于 2003-02-04 13:52:22 得分 0

学习Top

10 楼tiegerium(/*唐秀观*/)回复于 2003-02-05 20:14:38 得分 0

他妈的Java和C#有__finally关键字,std   C++没有,你try了,__finally  
  总是被执行,我不想用。Top

11 楼Adayuer(饭碗饭碗饭碗你在哪里?)回复于 2003-02-06 16:31:33 得分 0

学习Top

12 楼pazee(耙子)(今年过年不收礼,收礼只收尿不湿)回复于 2003-02-06 16:43:13 得分 0

__finally   的确可以没有,他完全可以被try   ...catch实现,但是有了他更方便,起码书写的逻辑更容易理解了。  
   
  可能类似:  
    有了   "或"   和   "非"   可以不用   "与",但是"与"一样也有了,因为方便;  
    有了减法可以没有加法,但是加法还是有着方便;  
    for,   while,   do   都可以用   while来替代,但是有了这些,更方便了。Top

13 楼copy_paste(木石三)回复于 2003-02-06 17:04:46 得分 0

__finally俺不觉得多余,相反在没有的话,我真不知道很多情况下怎么处理。特别是异常的情况的。  
   
  HANDLE   H   =   CreateFile(...);  
  try  
  {  
      //#1  
      if   (TRUE)  
          throw   Exception("Error,   Some   message");  
  }  
  __finally  
  {  
      CloseHandle(H);  
  }  
  return;  
   
  如上#1的地方,需要一个抛出异常的情况,如果没有__finally,也许可以写成:  
  HANDLE   H   =   CreateFile(...);  
  try  
  {  
      //#1  
      if   (TRUE)  
          throw   Exception("Error,   Some   message");  
      ...  
      //   正常   ...  
      CloseHandle(H);  
      return;  
  }  
  catch(...)  
  {  
      CloseHandle(H);  
      return;  
  }  
   
  一般异常的用法不是这样,至少我不是这样用的,  
   
  我不用去显示的截取异常,只会去抛出一个异常,告诉程序,有一个错误发生,我要中止运行程序了,而不是使用“return”来返回,"return"是无条件返回,有些资源被Create了,但因为没有使用__finally结构,中间出现了一个错误,使用了return就返回。(感觉是不负责任)  
  像:  
  #1      
  HANDLE   H1   =   CreateFile(...);  
  if   (INVALID_HANDLE_VALUE   ==   H1)  
  {  
      MessageBox(...);  
      return;  
  }  
   
  #2  
  HANDLE   H2   =   CreateFile(...);  
  if   (INVALID_HANDLE_VALUE   ==   H2)  
  {  
      MessageBox(...);  
      return;  
  }  
  #1中出错了无可非议,但#2那里出错了,它也如此,它应该CloseHandle(H1)再return,  
  只是举个例子,因为程序有时比较复杂,你能保证面面俱到的保护每个Create后的资源都释放掉了吗?而且用了__finally你的程序结构会简洁了很多,所以我会跟其它人说:建议使用try   __finally结构。  
   
  而且我不会使用:  
  try  
  {  
  }  
  catch(...)  
  {  
      //在这里我不会截取异常,我只会再抛出一个自己的异常,或改变异常的信息  
      //异常自有它的用处,Delphi,   VC,   C#基本上都有了自己的异常处理机制,  
      //我们要做的是抛出一个异常,   而不是截取异常。  
      throw   Exception("Error,   My   Message");  
  }  
   
  不管是win32和Console的程序,都有自己异常机制,而自己再去做一次,真是有点浪费。。。Top

14 楼ffww(疯子)回复于 2003-02-07 17:04:57 得分 0

__finally无论try有没有异常抛出来,都会被执行Top

15 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2003-02-07 20:36:53 得分 0

楼上的情况:  
      try  
            {  
            }  
      catch(...)  
            {  
            }  
  //   ----下面代码无论怎样都会执行,__finally有何用  
        ...........  
  Top

16 楼copy_paste(木石三)回复于 2003-02-07 21:53:43 得分 0

try  
            {  
            }  
      catch(...)  
            {  
                  //在这里重新抛出异常,而不是截取异常。  
                  Error   proc;  
                  throw;                 //   重新将异常抛出。  
                  //   or   throw   MyException(....);  
            }  
   
  我从来不认为应该在catch中截取异常,而是自己抛出异常。  
   
   
  不管什么异常都是设计者设计抛出的,如果按try   catch思想,那是永远不会有异常出来了,那要throw,   try   catch,   __finally做什么。  
   
  异常作用就是最外层有一层try   catch,将没人管的异常MessageBox   or   printf出来,这就是异常,__finally的作用是在异常发生时,将资源正当的释放,VCL的Application,   Console的最外层都有这一层,VC,C#也有(VB不知有没异常,Unknow)Top

17 楼Behard(我爱天安门)回复于 2003-02-08 09:22:17 得分 0

__finally  
  是   Delphi   带入   BCB   的,C++   没有  
  两种做法都有理由,但是只使用   C/C++   的人建议不使用   __finally  
   
  【我认为这只是习惯】  
  没有  
  try{}  
  catch(...){}  
  __finally{}  
  的Top

18 楼deavilness(俠盜裸奔漢)回复于 2003-02-09 09:41:26 得分 0

精彩!!!  
  学习!!!Top

19 楼ShanShiMin(Delphi+C#=我的最爱)回复于 2003-02-09 09:47:46 得分 0

个人认为Finally还是比较实用的,但如果能够使用try...except...finally嵌套的话,效果将会更好Top

相关问题

  • 大家来讨论关键字"Me","My"都是什么意思
  • 关键字:数据库,多用户,TTreeView,大家有空进来讨论讨论
  • delphi怎么不能自动完成关键字
  • delphi中有没有自动完成关键字的功能?
  • Delphi中set of关键字的含义是什么
  • Delphi中ln关键字是哟什么用啊
  • !速结贴:有关New关键字的讨论,欢迎大家进来啊:)
  • 讨论:关于web2.0中tag(标签、关键字、tags)的技术实现
  • 如何实现像delphi编辑窗口中关键字不同颜色显示?
  • 请问类似DELPHI中With 这个关键字在C++中是什么?

关键词

  • c#
  • c++
  • 执行
  • 结构
  • delphi
  • 异常
  • 抛出
  • 截取
  • 多余
  • finally

得分解答快速导航

  • 帖主:deavilness

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
惹火投票。。火热进行中...

社区焦点:

教你怎样用C#搞笑整人
最懒惰的程序员写的Cache
程序员如何掌握专业英语
Java栈与堆
分享:让人懊恼的面试
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo