一 重新抛出与捕获所有异常:
(1)重新抛出:
*有可能单个catch不能完全处理一个异常,在进行一些校正工作之后,catch可能确定该异常必须由函数调用链中更上次的函数来处理。
*格式:
重新抛出是后面不跟类型或表达式的一个throw:throw。
*空throw将重新抛出异常对象,只能出现在catch或者从catch调用的函数中。如果在处理代码不活的时遇到空throw语句,就调用terminate函数。
*被抛出的异常是原来的异常对象,而不是catch形参。
(2)捕获所有异常:
*因为不可能知道可能被抛出的所有异常,所以可以使用捕获所有异常catch子句。捕获所有异常的格式:
catch(...)
{}
*catch(...)经常与重新抛出表达式结合使用,catch完成可做的所有局部工作,然后重新抛出异常。
*注意:
如果catch(...)与其他catch子句结合使用,它必须是最后一个,否则,任何跟在它后面的catch子句都将不能被匹配。
二 函数测试块与构造函数:
*为了处理来自构造函数的异常,必须将构造函数编写为函数测试块(因为构造函数要处理来自初始化列表的异常)。使用函数测试块将一组catch子句和函数联成一个整体。
*构造函数测试块格式:
Test(int a,int b) try:aa(a),bb(b)
{//函数体}
catch(){}
三 可以定义自己的异常层次来表示可能出现于特定应用程序的问题。
四 异常说明:
(一)概述
*异常说明(exception specification):如果函数抛出异常,被抛出的异常将是包含在该说明中的一种,或者是从列出的异常中派生的类型。如果一个函数没有指定异常说明,则该函数可以抛出任意类型的异常。
格式:void test(int) throw(T1,T2,T3...)
*如果函数抛出了没有在其异常说明中列出的异常,就调用标准库函数unexpected。默认情况下,unexpected函数调用terminate函数,terminate函数一般会终止程序。
*空说明列表指出函数不抛出任何异常。
格式:function throw()
(二)使用情况:
*与非成员函一样,成员函数的异常说明跟在函数的形参表之后。
*析构函数不应该抛出异常。
*派生类虚函数的异常说明必须与对应基类虚函数的异常说明同样严格或者比后者更受限。
*异常说明是函数类型的一部分,所以可以在函数指针的定义中提供异常说明。