在讨论C++异常处理之前,先看看一个C语言编程中常见的例子:
#include <stdio.h>
FILE *fp;
Fp=fopen(“test.txt”,”r”);
If(fp==NULL)
{
printf(“Can’t Open File!/n”);
exit(0);
}
一个健壮的程序需要考虑很多会使程序失效的因素,如果对各种因素都进行如上的条件判断,那么整个程序的结构就会变得非常混乱。
C++处理错误的方法由不一样,它有如下特点:
1、 不需要打乱程序的结构,如果没有任何错误产生,那么程序的运行应该不受任何影响。
2、 不依靠函数的返回值来报告错误是否产生。
3、 即使采用集中的方式处理错误,也能够根据错误种类的不同来进行对应的错误处理操作。
下面来看看C++中提供的异常机制是如何做到这几点的。
///---------------------------------------------------------------------------
#include <iostream.h>
#include <vcl.h>
#pragma hdrstop
///---------------------------------------------------------------------------
#pragma argsused
int main(int argc, char* argv[])
{
double *data;
try
{
data=new double[1000];
}
std::bad_alloc是new操作符唯一可能发出的异常
catch(std::bad_alloc)
{
cout<<"can't alloc memory!"<<endl;
exit(0);
}
捕获所有剩下的异常
catch(...)
{
}
delete []data;
ShowMessage("ok");
return 0;
}
///---------------------------------------------------------------------------
使用异常的语法很简单,对所有可能产生异常的语句包含在try块中,并在随后的catch语句中捕获发生的异常。一个try块后可以跟随几个不同的catch语句,用来捕获不同的异常。如果希望捕获任何可能发生的异常,应该使用catch(…)语句。如果希望在自己编写的程序中产生异常,可以按如下的方法:
///---------------------------------------------------------------------------
#include <iostream.h>
#include <vcl.h>
#pragma hdrstop
///---------------------------------------------------------------------------
#pragma argsused
class Out{};
int main(int argc, char* argv[])
{
try
{
throw Out(); ///抛出一个临时的Out对象
}
catch(Out& e) ///捕获Out异常
{
cout<<"Out Exception throwed!"<<endl;
throw; ///向外层抛出异常
}
return 0;
}
///---------------------------------------------------------------------------
利用关键字throw可以抛出任意的对象。这个对象不需要继承exception类。即使是基本类型数据,也可以作为throw的参数抛出。在catch的参数中如果包含一个类似变量声明的表达式,就可以在catch块中使用这个异常对象。如果在catch块中处理完一个异常后,异常造成的后果并不能完全消除,那么可以在catch语句中再次调用catch语句,从而使得捕获向外层传播。如果一个函数中没有处理发生的异常,那么异常将会传播到调用此函数的代码段中。
正文