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

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

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

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

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

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

时间: 2025-01-21 11:14:28

如何编写异常安全的C++代码的相关文章

如何编写高质量的VB代码(1)

如何编写高质量的VB代码 简介: 本文描述了如何通过一些技术手段来提高VB代码的执行效率.这些手段可以分为两个大的部分:编码技术和编译优化技术.在编码技术中介绍了如何通过使用高效的数据类型.减少外部引用等编程手段来提高代码执行速度,减少代码消耗的系统资源.在编译优化技术中介绍了如何正确地利用VB提供的编译选项对在编译时最后生成的可执行文件进行优化. 前言 什么是一个高效的软件?一个高效的软件不仅应该比实现同样功能的软件运行得更快,还应该消耗更少的系统资源.这篇文章汇集了作者在使用VB进行软件开发

如何编写高质量的VB代码(2)

如何编写高质量的VB代码(2) 12. 销毁对象 无论编写的是什么软件,程序员都需要考虑在用户决定终止软件运行后释放软件占用的内存空间.但遗憾的是很多程序员对这一点好像并不是很在意.正确的做法是在退出程序前需要销毁程序中使用的对象.例如:Dim FSO as New FileSystemObject注释: 执行操作注释: 销毁对象Set FSO = Nothing对于窗体,可以进行卸载:Unload frmMain 或Set frmMain = Nothing 13. 变长和定长字符串 从技术上

vb编程-用vb开发编写一段找图代码

问题描述 用vb开发编写一段找图代码 用vb开发编写一段找图代码用什么算法能做到快速准确节省处理器资源呢? 解决方案 对一段VB代码的总结~

api-如何用jbehave进行编写测试API的自动化测试代码呢?

问题描述 如何用jbehave进行编写测试API的自动化测试代码呢? 如何用jbehave进行编写测试API的自动化测试代码呢?请各位大神支招..谢谢了 解决方案 http://yangzb.iteye.com/blog/309354

设计-如何编写一段c++测试代码

问题描述 如何编写一段c++测试代码 如题,我是一位初学者,现有一道题如下: 编一段代码,分别实现插入排序,合并排序和快速排序的算法.然后编写测试代码,设计测试数据集,编写测试程序,测试正确性.算法复杂性和效率. 题目中注明检测正确性的测试程序应该输出一个遍历结果,保证所有分支语句都检测到.不太理解这是要我做什么--以及比较算法复杂性.效率,是需我明确地输出花费时间吗? 希望有大神可以在测试代码这方面指点迷津,谢谢! 解决方案 "主要是你要准备足够充分的测试数据,这样才能保证代码的覆盖率.&qu

c#-用C#编写网络画图程序 程序代码也可以 谢谢!

问题描述 用C#编写网络画图程序 程序代码也可以 谢谢! 设计要求:(1)采用C/S模式,每个用户拥有一个帐号和密码,成功登录后在客户端上实现画图,画图文件由用户选择保存在服务器或者客户端.(2)用户可以查看服务器及客户端上文件夹里的画图文件.(3)服务器可以同时服务多个画图用户.(4)画图程序具备以下功能:①绘制直线.椭圆.圆弧.矩形.多边形及草稿线.②设置绘制图形的颜色及线条粗细.③能够对封闭图形进行填充.④读入及保存绘制图形. 解决方案 http://www.cnblogs.com/stg

c++问题-C++编写三排日历输出代码

问题描述 C++编写三排日历输出代码 输入年份输出该年的日历 要求每行输出3个月的就是按季度输出 每行一个月的已经会了 解决方案 简单的日历输出代码日历代码日历代码 解决方案二: http://zhidao.baidu.com/link?url=H5JeiAhtFeclU417pyuzhqPvcmDamNDM5-p2hcBPs4u-hH0QH-BN09rz1GY-Fts1MDm1jCQ7y5k3ztLnZ3D_iq

javascript-怎样编写完整的网站js代码?

问题描述 怎样编写完整的网站js代码? 看了一下大型的网站,好像他们的js代码好复杂.同样的效果和我平时写的代码不一样,例如tab菜单切换(京东首页的三级菜单)这些 还有所有的js是不是用匿名函数写的? 解决方案 你要什么功能就编写,公用的功能同一个到一个js文件里面,script导入即可,不需要每个页面都放. 你写匿名函数干嘛,一般都有名字的,要不你怎么调用.匿名函数一般是防止变量污染用的,如下面 var a=1 (function(){ var a=2; alert(a)//2 })() a

c++编写简单的车位管理系统代码

问题描述 c++编写简单的车位管理系统代码 随着家庭购买汽车的增加,停车场车位紧张的问题越来越突出.请根据题目要求完成简单的车位管理程序. 1.停车场有若干停车位(为说明问题,假定为3个),每个位置可以存放不同种类的汽车,包括卡车Truck,客车Carriage和小轿车Car,但同一时刻一个位置只能存放0或1辆汽车. 2.管理系统模拟实际车辆停车的情况: ①停车:新来车辆时如果有空位,按顺序为该车分配停车位,并自动记录开始停车的时间(用系统的时间): ②计费:车辆开走时,输入车位编号,自动记录结