C++的异常处理与Java的不同和变通

middle 2002-08-15 01:40:10
最近看到了几篇关于RAII(Resource Allocation Is Initialization)的文章,个人感觉这个方法实际就是C++中对Java的final block的模拟(可能不太恰当,因为C++是先出现的,但是姑且如此说)。

Java中引入final block就是为那些无论是否出现异常都需要被执行到的代码提供一个恰当的地方,避免code duplication。这是Java先进的地方,但是事有两面,这也是由于Java没有destructor而不得不采用的方法。

C++中至今没有引入final block的语法,我估计是因为C++中早就有了具备此项功能的东西---destructor,它同样能够不论异常发生与否,都被执行。只需将具有final block性质的代码放到某个专门为此设计的类的destrctor中即可。这种方法的缺陷是要定义新的class。这是C++的不足,但是同样体现了C++的精巧,能够用技巧实现的东西,轻易不会改动language level的东西。
...全文
70 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tommy 2002-08-15
  • 打赏
  • 举报
回复
这个问题在Bjarne Stroustrup's C++ Style and Technique FAQ(http://www.research.att.com/~bs/bs_faq2.html#finally)中有提及。

作者(C++作者)认为Because C++ supports an alternative that is almost always better: The "resource acquisition is initialization" technique,所以没必要引入finally

用这种办法,对于每种资源只需要写一次代码,就可以保证每次的使用都是正确的。如果用finally结构的话,必须在每个用到的地方都写相同的释放资源的代码,代码重复,而且一但在哪个地方忘记加上的话,那就出问题了。所以这并不是因为没有finally而作的变通,而是没必要用finally。

我个人认为,用这种方法的话,只要你写好一个类,就算是新手也可以用来写出正确的代码,用finally的话,必须要求每个人都掌握这个原则,要求较高。

Oversense 2002-08-15
  • 打赏
  • 举报
回复
微软的扩展里面就有try...finally...
不过微软建议使用c++标准。

destructor一定都会被执行。
ruanjiandev 2002-08-15
  • 打赏
  • 举报
回复
微软的标准里面就有try...finally...
不过微软建议使用c++标准。

而且,destructor不一定都会被执行。

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧