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等有交换的操作时,不用担心会引发异常。

|