论坛登陆 注册 教程 笑话 影视 投稿
首页 | 页界资讯 | 网络应用 | 软件应用 | 组网技术 | 网络原理 | 聊天通讯 | 网管知识 | 帮助
笑话 | 操作系统 | 注 册 表 | 编程开发 | 数 据 库 | 媒体动画 | 网页设计 | 图形图象 | 地图
论坛 | 网络安全 | 安全防范 | 服 务 器 | 硬件学堂 | 路由技术 | 搜索研究 | 站长经验 | 投稿
影院 | 教育频道 | 特色专题 | 精文荟萃 | 注 册 码 | 论坛社区 | 网站地图 | 广告服务 | 旧版
设为首页 加入收藏
当前位置:首页>>文章>>编程开发>>C/C++>>正文

如何编写异常安全的C++代码

www.xker.com 作者: 来源:网易学院 加入日期:2006-4-17 9:40:12

【问题提问、论坛交流】关于C++中异常的争论何其多也,但往往是一些不合事实的误解异常曾经是一个难以用好的语言特性,幸运的是,随着C++社区经验的积累,今天我们已经有足够的知识轻松编写异常安全的代码了,而且编写异常安全的代码一般也不会对性能造成影响

  使用异常还是返回错误码?这是个争论不休的话题大家一定听说过这样的说法:只有在真正异常的时候,才使用异常那什么是“真正异常的时候”?在回答这个问题以前,让我们先看一看程序设计中的不变式原理

  对象就是属性聚合加方法,如何判定一个对象的属性聚合是不是处于逻辑上正确的状态呢?这可以通过一系列的断言,最后下一个结论说:这个对象的属性聚合逻辑上是正确的或者是有问题的这些断言就是衡量对象属性聚合对错的不变式

  我们通常在函数调用中,实施不变式的检查不变式分为三类:前条件,后条件和不变式前条件是指在函数调用之前,必须满足的逻辑条件,后条件是函数调用后必须满足的逻辑条件,不变式则是整个函数执行中都必须满足的条件在我们的讨论中,不变式既是前条件又是后条件前条件是必须满足的,如果不满足,那就是程序逻辑错误,后条件则不一定现在,我们可以用不变式来严格定义异常状况了:满足前条件,但是无法满足后条件,即为异常状况当且仅当发生异常状况时,才抛出异常

  关于何时抛出异常的回答中,并不排斥返回值报告错误,而且这两者是正交的然而,从我们经验上来说,完全可以在这两者中加以选择,这又是为什么呢?事实上,当我们做出这种选择时,必然意味着接口语意的改变,在不改变接口的情况下,其实是无法选择的(试试看,用返回值处理构造函数中的错误)通过不变式区别出正常和异常状况,还可以更好地提炼接口

  对于异常安全的评定,可分为三个级别:基本保证、强保证和不会失败

  基本保证:确保出现异常时程序(对象)处于未知但有效的状态所谓有效,即对象的不变式检查全部通过

  强保证:确保操作的事务性,要么成功,程序处于目标状态,要么不发生改变

  不会失败:对于大多数函数来说,这是很难保证的对于C++程序,至少析构函数、释放函数和swap函数要确保不会失败,这是编写异常安全代码的基础

  首先从异常情况下资源管理的问题开始.很多人可能都这么干过:

Type* obj = new Type;
try{ do_something...}
catch(...){ delete obj; throw;}

  不要这么做!这么做只会使你的代码看上去混乱,而且会降低效率,这也是一直以来异常名声不大好的原因之一. 请借助于RAII技术来完成这样的工作:

auto_ptrobj_ptr(new Type);
do_something...

  这样的代码简洁、安全而且无损于效率当你不关心或是无法处理异常时,请不要试图捕获它并非使用try...catch才能编写异常安全的代码,大部分异常安全的代码都不需要try...catch我承认,现实世界并非总是如上述的例子那样简单,但是这个例子确实可以代表很多异常安全代码的做法在这个例子中,boost::scoped_ptr是auto_ptr一个更适合的替代品

  现在来考虑这样一个构造函数:

Type() : m_a(new TypeA), m_b(new TypeB){}
  假设成员变量m_a和m_b是原始的指针类型,并且和Type内的申明顺序一致这样的代码是不安全的,它存在资源泄漏问题,构造函数的失败回滚机制无法应对这样的问题如果new TypeB抛出异常,new TypeA返回的资源是得不到释放机会的.曾经,很多人用这样的方法避免异常:

本新闻共5页,当前在第1页  1  2  3  4  5  

编辑:xker.com

上一篇:C/C++语言void及void指针深层探索
下一篇:没有了
关闭窗口】【技术交流】【收藏此页
相关文章
·C/C++语言void及void指针深层探索·原创:一个c++写的发牌程序·C++中的const限定修饰符
·C++类的继承与多重继承的访问控制·用 VC++和Winsock 实现与 HTTP 服务·深入浅出VC++串口编程之DOS的串口编程
·C++/CLI中实现singleton模式·C++箴言:为类型信息使用特征类·Visual C++中回调函数使用的变身大法
·Visual C++中轻松实现透明滑动控件·探索C++的秘密之详解extern·VC++实现Windows系统回收站的文件存取
·在VC++应用程序中实现颜色选择组合框·C++之父Bjarne谈C++中的STL模板·用Visual C++语言在局域网实现IP多播
推荐文章 最新文章 热门文章
·如何编写异常安全的C++代码
·使用Java API压缩和解压缩数据
·将劲舞团游戏录像转成WMV录像的方法
·C/C++语言void及void指针深层探索
·VB游戏攻略
·用ASP.NET 2.0实现AJAX风格的Web开发
·Windows常见文件修复技巧
·Java 理论与实践: 良好的内务处理实践
·红黑过招 WinRAR破解“磁盘加密王”
·Windows组策略为共享目录安全保驾护航
·总结:内存卡故障解决小秘技
·Java学习之路:不走弯路,就是捷径
·用注册表对系统进行全方位维护和管理
·最后防线 WinXP八种安全模式揭密
·原创:一个c++写的发牌程序
·如何编写异常安全的C++代码
·经典JAVA IDE-Eclips使用秘技
·使用Java API压缩和解压缩数据
·百度硬盘搜索2.0正式版体验
·Google新推日历服务 用户可以写日志
·将劲舞团游戏录像转成WMV录像的方法
·C/C++语言void及void指针深层探索
·PhotoShop制作国画水墨荷花图
·VB游戏攻略
·QQ玩出“迷你”味道
·JavaBeans程序开发基础教程
·建设个人网站的一点心得
·HTML网页制作技巧汇编
·实战代码分析 为网页加播放器
·QQ好友自定义头像不更新的解决办法
·个人简历表格
·免费代理IP(每日更新)
·QQ密码丢失后能做的事情:快速找回密码
·QQ收费头像免费使用的方法 
·Norton AntiVirus 2006 注册码(激活
·系统优化 专题
·WinRAR 3.51 注册码
·豪杰超级解霸V9.1正版注册码
·找回QQ密码的注意事项 
·史上最强QQ个人档案资料欣赏
·QQ空间皮肤代码
·Ajax技术开发指南
·计算机毕业论文
·最经典的黑客入门教材
·梦幻西游科举考试答案最新版
评论

设为首页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyright © 2003-2006 xker.com All rights reserved.小新技术网 合作广告QQ:12231446
本页浏览次数: