其他语言

本类阅读TOP10

·基于Solaris 开发环境的整体构思
·使用AutoMake轻松生成Makefile
·BCB数据库图像保存技术
·GNU中的Makefile
·射频芯片nRF401天线设计的分析
·iframe 的自适应高度
·BCB之Socket通信
·软件企业如何实施CMM
·入门系列--OpenGL最简单的入门
·WIN95中日志钩子(JournalRecord Hook)的使用

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
Item 38. 异常安全之公理(Exception Safety Axioms)

作者:未知 来源:月光软件站 加入时间:2005-5-13 月光软件站

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




相关文章

相关软件