C++异常处理机制---try&throw&catch

来源:互联网 发布:深入浅出sql 下载 编辑:程序博客网 时间:2024/05/12 13:45
异常处理的方法

      所谓异常处理指的是对运行时出现的差错以及其他例外情况的处理。在程序设计时,应当事先充分分析程序运行时可能出现的各种意外情况,并且分别制定出相应的处理方法,这就是程序的异常处理的任务。


      在一个小的程序中,可以用比较简单的方法处理异常,例如用if语句判断除数是否是0,如果是0,则输出一个出错的信息。但是在一个大的系统中,包含许多模块,每个模块又包含许多类和函数,函数之间又相互调用比较复杂。如果在每一个函数中都设置处理异常的程序段,会使程序过于异常和庞大。因此C++采取的办法是:如果在执行一个函数过程中出现异常,可以不在本函数中立刻处理,而是发出一个信息,传给它的上一级(即调用它的函数),它的上级捕捉到这个信息后进行处理;如果上级的函数也不能处理,就再传给其上一级,由上一级处理。如此逐级上送,如果到最上一级还无法处理,最后只好异常终止程序的执行。


      这样做使得异常的发现和处理不必由同一函数来完成,好处是使底层的函数专门用于解决实际任务,而不必再承担处理异常的任务,以减轻底层函数的负担,而把处理异常的任务上移到某一层去处理。例如主函数中调用十几个函数,只须在主函数中设置处理异常即可,而不必在每个函数中都设置处理异常,这样可以提高效率。

      C++的处理异常的机制是由3个部分组成的:检查(try),抛出(throw)和捕捉(catch)

把需要检查的语句放在try块中,throw用来当出现异常时发出一个异常信息,而catch则用来捕捉异常信息,如果捕捉到了异常信息,就处理它。


无异常处理示例代码:

//计算三角形的面积//没有异常处理#include<iostream>#include<cmath>using namespace std;int main(){double triangle(double,double,double);double a,b,c;cin>>a>>b>>c;while(a>0&&b>0&&c>0){cout<<triangle(a,b,c)<<endl;cin>>a>>b>>c;}system("pause");return 0;}double triangle(double a,double b,double c){double area;double s=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c));return area;}


从运行结果可以看出,这个程序没有对输入的异常进行处理,因为输入的有些参数构成不了三角形,就不存在面积。


有异常处理的示例:

//计算三角形面积//有异常处理#include<iostream>#include<cmath>using namespace std;int main(){double triangle(double,double,double);double a,b,c;cin>>a>>b>>c;try{while(a>0&&b>0&&c>0){cout<<triangle(a,b,c)<<endl;cin>>a>>b>>c;}}catch(double){cout<<"a="<<a<<",b="<<b<<",c="<<c<<",this is not a triangle!"<<endl;}system("pause");return 0;}double triangle(double a,double b,double c){double s=(a+b+c)/2;if(a+b<=c||a+c<=b||b+c<=a)throw a;return sqrt(s*(s-a)*(s-b)*(s-c));}

运行结果:


从运行结果可以看到,现在输入不能后称三角形的参数,程序就启动异常处理,主函数返回异常信息。


注意:在进行异常处理后,程序并不会自动终止,继续执行catch后面的语句,即处理异常后,并不是从出现异常点继续执行while循环。如果在try块的花括号内有10个语句,在执行第4个语句时出现异常,则处理完异常后,其余6条语句不再执行,而转到catch后面的语句继续去执行。

0 0
原创粉丝点击