C++异常处理机制由三部分组成,即检查(try)、抛出(throw)、和捕捉(catch)。把需要检查的语句放在try中,throw用来当出现异常是抛出异常信息,而catch则用来捕捉异常信息。
一个简单的例子:
#include#include using namespace std; int main() { double triangle(double,double,double); double a,b,c; cin>>a>>b>>c; try //在try中包含要检查的函数 { while(a>0&&b>0&&c>0) { cout<<"the area is :"< >a>>b>>c; } } catch(double)//用catch捕获异常信息,并做出相应处理 { cout<<"a="<
当用户输入的数据不满足,两边之和大于第三边的时候,抛出异常,然后进行处理。就单纯看这个例子的话,异常处理机制的用处并不大,因为处理还不如在triangle函数中直接给出警告简洁。
但是在一个大的系统那个中,包含许多模块,每个模块又包含很多函数,函数之间又相互调用,比较复杂。如果在每一个函数中都设置处理异常的程序段,会使程序过于复杂和庞大。
因此,如果在执行一个函数过程中,出现异常,可以不在本函数中立即处理,而是抛出一个异常,传给它的上一级(即调用它的函数),它的上级可以选择处理该异常,或者再往它的上级传递,如此逐级上升,如果最高一级还是无法处理,就调用系统函数terminate,使程序终止运行。
下面看个稍微复杂的例子:
#includeusing namespace std; int main() { void f1(); try { f1(); //在main函数中调用f1 } catch(double) { cout<<"ERROR_MAIN"<
运行结果:ERROR_MAIN
END_MAIN(1)f3函数在try部分抛出异常,但是不符合f3的catch,于是依次往上级找,直到找到了main函数中的catch函数,由main中的catch进行处理。
(2)如果将f3函数改为:
void f3() { double a=2.0; try { throw a; } catch(double) { cout<<"ERROR_F3"<输出结果为: ERROR_F3
END_F3
END_F2
END_F1
END_MAIN
f3函数中throw的异常信息立即被f3函数中的catch子语句捕获。于是执行catch子句中的语句,再执行catch后面的语句,执行完了之后,f3函数执行结束后,流程返回f2函数中调用f3函数继续向下执行。
(3)如果将f3函数改为:
void f3() { double a=2.0; try { throw a; } catch(double) { cout<<"ERROR_F3"<
输出结果为:
ERROR_F3
ERROR_MAIN
END_MAIN
f3函数中的catch语句捕捉到抛出的异常之后,输出ERROR_F3,表示收到该异常,但它又立即用throw将a再次抛出。最后别main函数中的catch语句捕获。