Item 38. 异常安全之公理(Exception Safety Axioms)

王朝other·作者佚名  2006-01-09
宽屏版  字体: |||超大  

Item 38. Exception Safety Axioms

公理,公认之理,无需证明。

要证明一个欧几里得几何的定理,要借助于一系列的公理。

要判断代码是否是异常安全,也有一系列的公理可以借用。

------------------------------------------------------

1、异常是同步的 Exceptions Are Synchronous

异常是同步的,只能在函数调用时发生。

预定义类型的算法、赋值,以及其他底层的操作不会引发异常。(它们可能引发信号或中断,但那不较异常)

操作赋重载和模板使得判断异常变得复杂,因为经常难以确定一个操作是否会引发函数调用和潜在的异常。

例如对于用户定义类型String:

const char *a, *b;

String c, d;

//...

a = b; // no function call, no exception

c = d; // function call, maybe an exception

对于模板,事情变得更不确定:

template <typename T>

void aTemplateContext() {

T e, f;

T *g, *h;

//...

e = f; // function call? exception?

g = h; // no function call, no exception

//...

}

所以模板里的所有函数都得假定是一个函数调用,包括infix operators,和隐式转化。

2、析构是安全的 It's Safe to Destroy

通常,析构函数、operator delete 和 operator delete[] 不抛出异常。

所以如下的异常捕获没有必要:

X::~X() {

try {

delete ptr1_;

delete ptr2_;

}

catch( ... ) {}

}

只需如此:

X::~X() {

delete ptr1_;

delete ptr2_;

}

3、交换不抛出异常 Swap Doesn't Throw

在使用STL的sort, reverse, partition等有交换的操作时,不用担心会引发异常。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有