C++中的异常处理

8月 20th, 2012
Visited 2006 times, 1 so far today
0

Comments

                    对于程序中出现的异常,C++可以实现相应的异常处理机制。而并不会不友好的强制崩溃,在崩溃的时候会做出相应的提示。C++中的所有异常派生自基类exception,基类exception声明了visual的what函数,此函数可以直接被派生类复写,来实现自定义的异常提示信息。基类exception下面存在三大派生类  1.runtime_error(运行时错误)  2.logic_error(逻辑错误)  3.运算符错误。    

             第一类:runtime_error类下面派生有 1. overflow_error(运算溢出错误,即运算结果比计算机能存储的最大数值还要大),2. underflow_error(运算下溢错误,即运算结果比计算机所能存储的最小值还要小)。

             第二类: logic_error类下面派生有 1.invalid_argument(无效参数异常)   2.  length_error(即长度超过了对象所能承受的最大长度)    3.out_of_range(如值下标越过边界的错误)

              第三类的直接继承者有:1. bad_alloc(new动态申请内存抛出) ,  2. bad_cast(由dnamic_cast抛出),  3. bad_typeid(由typeid抛出)    4. bad_exception(即如果函数在抛出列表中存在bad_exception,就表示如果一个意外异常发生,函数unexception将抛出bad_exception异常,而不是直接结束程序的运行(默认),或者调用另外一个函数set_unexception指出的另一个函数。

c++中出现的异常可以一层一层的向外抛,即一个函数中发现了异常,可以直接向外层的调用函数所在的范围try{}内再次抛出。而如果这个异常在try{}范围内,即会启动相应的异常处理器catch(exception &){}中的异常处理代码完成相应的处理,然后把相应的流程控制权交到catch(exception &){}语句下的第一条语句继续执行(并不会回到抛出异常的那条语句下面继续执行,此条要切记!!)。C++中对于已经捕获的异常(如果自己解决不了或只能解决一部分异常)还可以再次抛出,通过关键字throw。这里有个注意点需要明记,重新抛出异常只有在相应的catch语句中才能重新抛出,否则程序直接调用terminate函数,放弃异常处理终止程序。

异常处理常见错误总结:

1.在一个try语句块后的两个不同的catch处理器中捕获相同的异常类型是一个逻辑错误

2.在一个try语句块后的两个不同catch处理器中派生类异常就放在相应基类异常之前,否则所有异常被基类catch处理器获取,派生类catch处理器永远无法执行。(此处基类异常指向派生类异常,会产生多态行为)。

例:重新抛出异常代码示例:

#include <iostream>
#include <exception>
#include <new>
using namespace std;

class myException : public exception{
public:
    myException():exception(“this is my Exception!!!”){};
};

void throwException(){
    try{
        cout<<“Now in throwException Function! “<<endl;
        throw myException();//基类异常的构造函数
    }catch(exception &e){
        cout<<e.what()<<endl;
        cout<<“Throw Exception again!”<<endl;
         throw;//重新抛出异常
    }
    
}

int main(){
    try{
    cout<<“Start in main Function! “<<endl;
    throwException();//调用相应的函数
    cout<<“this not print!!!”<<endl;

    }catch(exception &e){//不对相应的异常信息作任何的处理
        cout<<“now  in main Exception!!!”<<endl;
        cout<<e.what()<<endl;
    }
    cout<<“End in main Function!!!”<<endl;
}
执行结果:

Start in main Function!
Now in throwException Function!
this is my Exception!!!//自己定义的异常信息提示
Throw Exception again!
now  in main Exception!!!
this is my Exception!!!
End in main Function!!!