C++异常处理

来源:互联网 发布:网络投资平台黑名单 编辑:程序博客网 时间:2024/05/22 08:08
 重新抛出采用一个不带运算对象的throw表示,重新抛出的那个就是原来捕捉到的那个异常。

异常也为从构造函数里报告出错的问题提供了一个解决方案。由于构造函数无法返回一个独立的值供调用程序检查,传统的可能的解决方法有:
1、返回一个处于错误状态的对象,相信用户有办法检查其状态
2、设置一个非局部变量之处创建失败,相信用户能去检查这个变量
3、在构造函数里不做初始化,依靠用户在第一次使用对象之前调用某个初始化函数
4、将对象标记为“未初始化的”,让对这个对象调用的第一个成员函数去完成实际的初始化工作,并让这个函数在初始化失败时报告错误。
异常处理机制使构造失败的信息能从构造函数内部传出来。

构造函数本身可以通过将完整的函数体--包括成员初式表--包在一个try块里,自己设法捕捉这种异常。例如:
class X
{
    Vector v;
public:
    X(int);
};

X::X(int s)
try
    :v(s)
{
}
catch(...) //初始化异常在这里捕获
{
}

从异常处理的角度看,析构函数可能在两种情况下被调用
1、正常调用:作为某个作用于正常退出的结果,作为一个delete操作的结果等
2、在异常处理中被调用:在堆栈回退过程中,异常处理机制退出一个作用域,其中包含有析构函数的对象。
对于后一种情况,绝不能让析构函数里抛出异常。

void f(int a)throw(x2, x3);
说明f()只可能抛出两个异常x2和x3,以及从这些类型派生的异常,但不会抛出其他异常

如果函数声明中不带异常描述,那么就假定他可能抛出任何异常,例如:
int f(); //可能抛出任何异常
不抛出任何异常那个的函数可以用空表声明:
int g() throw(); //不会抛出异常

typedef不能用异常描述,例如:
typedef void (*pf)() throw(X); //错误

如果抛出的一个异常未被捕获,那就会调用函数std::terminate()。

为main()添加一个捕获一切的处理器
int main()
try
{
 //...
}
catch(std::range_error)
{
}
catch(std::bad_alloc)
{
}
catch(...)
{
}

原创粉丝点击