1. Exception specifications作为函数声明的一部分,用于指出(并不能限制)函数可能会抛出的异常函数.C++规定,一个拥有exception specification的函数指针只能被赋予一个有着相同或更为局限的exception specification的函数地址,因而编译器要保证"在函数指针传递之际检验exception specifications".(但visual studio 2013不支持此项要求)

2. 当函数抛出exception specification未列出的异常时,程序会调用标准库terminate函数,terminate函数又调用abort函数终止程序而不会留给程序员挽救的机会.这种情况很容易发生:当函数调用一个exception specification限制程度低于自身的函数时(C++明定编译器必须允许"调用某个函数而该函数可能违反调用函数本身的exception specification").

    通常需要采用以下策略防止"非预期expection"的出现:

    1). 对于带类型参数的函数模板,要尽量避免使用exception specifications,因为不同类型对于相同行为的定义不同,抛出的异常也就不同,因而函数模板很难或不可能确定它具现化的函数实体所可能抛出的异常.

    2). "如果A函数内调用了B函数,而B函数无exception specifications,那么A函数本身也不要设定exception specifications".这个比较容易实现,但有一种情况容易被忽略:使用回调(callback)函数时.

    对于以下类定义:

typedef void(*CallBackPtr)(int, int, void*);
class CallBack{
public:
    CallBack(CallBackPtr(fPtr), void*dataToPassBack) :func(fPtr), data(dataToPassBack){}
    void makeCallBack(int eventXLocation, int eventYLocation)const throw(){
        func(eventXLocation, eventYLocation,data);
    }
private:
    CallBackPtr func;
    void *data;
};
View Code

相关文章: