Item 38. 异常安全之公理(Exception Safety Axioms)
2005-04-22 11:10
330 查看
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等有交换的操作时,不用担心会引发异常。
公理,公认之理,无需证明。
要证明一个欧几里得几何的定理,要借助于一系列的公理。
要判断代码是否是异常安全,也有一系列的公理可以借用。
------------------------------------------------------
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等有交换的操作时,不用担心会引发异常。
相关文章推荐
- Item 38. 异常安全之公理(Exception Safety Axioms)
- Item 38. 异常安全之公理(Exception Safety Axioms)
- [翻译] Effective C++, 3rd Edition, Item 29: 争取 exception-safe code(异常安全代码)(上)
- [翻译] Effective C++, 3rd Edition, Item 29: 争取 exception-safe code(异常安全代码)(下)
- C++通用构件中的异常安全 Exception-Safety in Generic Components
- Item 39. 异常安全之函数(Exception Safe Functions)
- Item 39. 异常安全之函数(Exception Safe Functions)
- Item 39. 异常安全之函数(Exception Safe Functions)
- Item 29 异常安全
- ListView遍历每个Item出现NullPointerException的异常
- 《Effective C++》读书笔记之item29:为“异常安全”而努力是值得的
- [Domino]“java.lang.ClassCastException:lotus.domino.cso.Item”异常解决办法
- Effective C# Item45 : 优先选择强异常安全保证
- Item 8 异常安全的ctor和dtor
- ListView遍历每个Item出现NullPointerException的异常
- JAVASE基础 Item -- 异常处理Exception
- [Domino]“java.lang.ClassCastException:lotus.domino.cso.Item”异常解决办法
- 滑动RecyclerView时出现异常: java.lang.IndexOutOfBoundsException: Inconsistency detected. Invalid item position 6(offset:6).state:30
- TFC使用异常(WorkItemTypeDeniedOrNotExistException)
- 解决android.os.FileUriExposedException,exposed beyond app through ClipData.Item.getUri() 异常