异常处理的方法
在一个小的程序中,可以用比较简单的方法处理异常,例如用if语句判断除数是否是0,如果是0,则输出一个出错的信息。但是在一个大的系统中,包含许多模块,每个模块又包含许多类和函数,函数之间又相互调用比较复杂。如果在每一个函数中都设置处理异常的程序段,会使程序过于异常和庞大。因此C++采取的办法是:如果在执行一个函数过程中出现异常,可以不在本函数中立刻处理,而是发出一个信息,传给它的上一级(即调用它的函数),它的上级捕捉到这个信息后进行处理;如果上级的函数也不能处理,就再传给其上一级,由上一级处理。如此逐级上送,如果到最上一级还无法处理,最后只好异常终止程序的执行。
这样做使得异常的发现和处理不必由同一函数来完成,好处是使底层的函数专门用于解决实际任务,而不必再承担处理异常的任务,以减轻底层函数的负担,而把处理异常的任务上移到某一层去处理。例如主函数中调用十几个函数,只须在主函数中设置处理异常即可,而不必在每个函数中都设置处理异常,这样可以提高效率。
C++的处理异常的机制是由3个部分组成的: 检查(try),抛出(throw)和捕捉(catch)。
运行结果:
所谓异常处理指的是对运行时出现的差错以及其他例外情况的处理。在程序设计时,应当事先充分分析程序运行时可能出现的各种意外情况,并且分别制定出相应的处理方法,这就是程序的异常处理的任务。
在一个小的程序中,可以用比较简单的方法处理异常,例如用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后面的语句继续去执行。