二、异常处理的方法
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
在一个小的程序中,可以用比较简单的方法处理异常。但是在一个大的系统中,如果在每一个函数中都设置处理异常的程序段,会使程序过于复杂和庞大。因此,C++采取的办法是: 如果在执行一个函数过程中出现异常,可以不在本函数中立即处理,而是发出一个信息,传给它的上一级(即调用它的函数),它的上级捕捉到这个信息后进行处理。如果上一级的函数也不能处理,就再传给其上一级,由其上一级处理。如此逐级上送,如果到最高一级还无法处理,最后只好异常终止程序的执行。
这样做使异常的发现与处理不由同一函数来完成。好处是使底层的函数专门用于解决实际任务,而不必再承担处理异常的任务,以减轻底层函数的负担,而把处理异常的任务上移到某一层去处理。这样可以提高效率。
C++处理异常的机制是由3个部分组成的,即检查(try)、抛出(throw)和捕捉(catch)。把需要检查的语句放在try块中,throw用来当出现异常时发出一个异常信息,而catch则用来捕捉异常信息,如果捕捉到了异常信息,就处理它。
例1.给出三角形的三边a,b,c,求三角形的面积。只有a+b>c,b+c>a,c+a>b时才能构成三角形。设置异常处理,对不符合三角形条件的输出警告信息,不予计算。
先写出没有异常处理时的程序:
#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;
}
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;
}
运行情况如下:
6 5 4↙(输入a,b,c的值)
9.92157 (输出三角形的面积)
1 1.5 2↙ (输入a,b,c的值)
0.726184 (输出三角形的面积)
1 2 1↙ (输入a,b,c的值)
0 (输出三角形的面积,此结果显然不对,因为不是三角形)
1 0 6↙ (输入a,b,c的值)
(结束)
修改程序,在函数traingle中对三角形条件进行检查,如果不符合三角形条件,就抛出一个异常信息,在主函数中的try-catch块中调用traingle函数,检测有无异常信息,并作相应处理。修改后的程序如下:
#include <iostream>
#include <cmath>
using namespace std;
void main( )
{double triangle(double,double,double);
double a,b,c;
cin>>a>>b>>c;
try//在try块中包含要检查的函数
{while(a>0 && b>0 && c>0)
{cout<<triangle(a,b,c)<<endl;
cin>>a>>b>>c;
}
}
catch(double) //用catch捕捉异常信息并作相应处理
{cout<<″a=″<<a<<″,b=″<<b<<″,c=″<<c<<″,that is not a triangle!″<<endl;}
cout<<″end″<<endl;
}
double triangle(double a,double b,double c) //计算三角形的面积的函数
{double s=(a+b+c)/2;
if (a+b<=c||b+c<=a||c+a<=b) throw a; //当不符合三角形条件抛出异常信息
return sqrt(s*(s-a)*(s-b)*(s-c));
}
程序运行结果如下:
6 5 4↙(输入a,b,c的值)
9.92157 (计算出三角形的面积)
1 1.5 2↙ (输入a,b,c的值)
0.726184 (计算出三角形的面积)
1 2 1↙ (输入a,b,c的值)
a=1,b=2,c=1, that is not a triangle! (异常处理)
end
转载于:https://blog.51cto.com/pandahsu/168260