对java熟悉的朋友们都很清楚,java中的异常处理机制是非常完善的。并且java强制使用异常处理,用户必须对有可能出现异常的情况进行处理。在c++中并没有强制用户使用异常处理,但是使用异常处理将会使您的程序更加的健壮。
在c++中,一个函数在执行的过程中可以识别异常(例外),并通告异常的发生。这种通告机制称为抛出异常,使用关键字throw。异常抛出后,可以由函数的调用者进行捕捉并进行处理,使用关键字catch。我们一般将可能会抛出异常的程序块放到try语句块中去执行,以便用catch来进行捕捉。个人感觉c++中异常处理的这一套和java非常相似,都是try{......}catch(..){......}这种结构。下面看一个例子:
try
{
f();//f() may throw some exception
}
catch(int a)
{
......
}
catch(char b)
{
......
}
try程序块可能会抛出异常,由catch程序块来进行捕捉。catch块之间的顺序可以任意,但是必须位于try之后,另外catch块会将抛出的异常的类型与自己要捕捉的异常类型进行对比,如果匹配则进行捕捉。
while(true)
{
cout << "please enter the index and length to erase:"<<endl;
cin >>index>>length;
try
{
str.erase(index,length);
}
catch(out_of_range)
{
continue;
}
break;
}
如果输入的index大于字符串的长度将会引发一个异常out_of_range,即数组下标越界,这时异常就会被catch语句块捕捉到并进行处理。
下面用一个例子演示如何抛出异常:
const int MaxSize = 1000;
float arr[MaxSize];
enum out_of_bounds{underflow,overflow};
float& access(int i)
{
if(i<0)
{
throw underflow;
}
if(i>=MaxSize)
{
throw overflow;
}
}
try
{
......
val = access(k)
}
catch(out_of_bounds t)
{
if(t==overflow)
{
cerr<<"overflow"<<endl;
exit(EXIT_FAILURE);
}
if(t==underflow)
{
cerr<<"underflow"<<endl;
exit(EXIT_FAILURE);
}
}
由try语句块抛出异常,catch语句块进行捕捉后进行分析是什么异常,然后进行处理。