Chinaunix首页 | 论坛 | 博客
  • 博客访问: 575959
  • 博文数量: 79
  • 博客积分: 2513
  • 博客等级: 少校
  • 技术积分: 806
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-04 18:46
文章分类

全部博文(79)

文章存档

2014年(1)

2010年(5)

2009年(8)

2008年(11)

2007年(41)

2006年(13)

我的朋友

分类: C/C++

2008-01-07 18:57:20


最近看《Exceptional C++》这本书,实在太好了~也终于知道了“异常安全”和“异常中立”这两个东西的意思(其中“异常中立”我是第一次听到)。

说道异常安全,必须提到一个“不变性”问题。“不变性”一般是指一个对象,不论出现何种情况,这个对象还是能够保持某一种性质不变(有点像射影几何)。我的理解,主要就是不论如何出错,这个对象还是有效的、可用的。

异常安全就是对应这样的情况。异常安全是指,一个对象碰到异常之后,还能够保证自身的正确性(也就是出现异常后,对象还是有效、可用的)。惭愧的是,我以前对异常安全的理解似乎是,不抛出异常就是安全了。需要说明的是,C++ STL 的容器基本上都是异常安全的。

还有一种更严格的异常安全,叫做“强异常安全”。强异常安全不仅要求出现异常后对象要保证正确性,还要求对象不能作出任何改变,也就是实现“事务”的那种 commit-rollback 机制:要么成功,要么不改变。

异常中立,就是指任何底层的异常都会抛出到上层,也就相当于是异常透明的。


[美] Herb Sutter 著;卓小涛 译。《Exceptional C++中文版》。北京:中国电力出版社,2003年3月北京第一版。
阅读(3636) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

BenBear2008-02-16 14:18:45

我觉得着两种情况没有区别。书中说道的,实现不变性最好的方法是先在临时对象上操作,然后一次 swap。这中间,swap 的过程必须是不会抛出异常的。

yiding_he2008-02-02 08:46:36

“碰到异常”这样的描述过于模糊,不知道书中是不是给了典型的示例。我觉得“碰到异常”主要指两种情况:1)对象的方法在执行过程中遇到别的地方抛出的异常;2)对象的方法在执行过程中由于特定情况无法执行下去,于是主动抛出异常。在这两种情况下如何分别保持对象的“不变性”和“正确性”,这也是一个需要在实践中思索的问题。我也是头一次听说这两个词,这让我学到不少啊。