C++——异常处理
程序的异常处理是使得程序具有一定的容错性,是指允许给运行环境或者人为因素的一些错误的提示或处理。其基本思想:每一个函数要负责发现异常,不必去处理错误,但是需要构造一个异常对象向调用者抛出该异常。该调用者查看异常对象,判断是否能够解决,给用户提示;如果处理不了,则需要继续向更上一级的调用者抛出异常,如此类推,直至抛掷给操作系统,终止程序。主要见下图:
抛弃异常的程序:throw 表达式;
捕获并处理:try 复合语句 catch(异常类型声明 )复合语句……
若有异常则通过throw操作创建一个异常对象并抛掷。
将可能抛出异常的程序段嵌在try块之中。控制通过正常的顺序执行到达try语句,然后执行try块内的保护段。
如果在保护段执行期间没有引起异常,那么跟在try块后的catch子句就不执行。程序从try块后跟随的最后一个catch子句后面的语句继续执行下去。
catch子句按其在try块后出现的顺序被检查。匹配的catch子句将捕获并处理异常(或继续抛掷异常)。
如果匹配的处理器未找到,则运行函数terminate将被自动调用,其缺省功能是调用abort终止程序。
//处理除0异常
#include<iostream>
using namespace std;
int Div(int x,int y);
int main()
{
try
{
cout<<"5/2="<<Div(5,2)<<endl;
cout<<"8/0="<<Div(8,0)<<endl;
cout<<"7/1="<<Div(7,1)<<endl;
}
catch(int)
{
cout<<"except of deviding zero.\n";
}
cout<<"that is ok.\n";
}
int Div(int x,int y)
{
if(y==0)
throw y;
return x/y;
}//程序运行结果如下:
5/2=2
except of deviding zero.
that is ok.
异常接口声明:可以在函数的声明中列出这个函数可能抛掷的所有异常类型。例:void fun() throw(a,b,c);
如果没有异常接口,则此函数可以抛掷任何异常。不抛掷任何类型异常的函数声明如下:void fun() throw();
异常处理中的构造和析构:找到一个匹配的catch异常处理后,初始化参数。将从对应的try块开始到异常被抛掷处之间构造(且尚未析构)的所有自动对象进行析构。从最后一个catch处理之后开始恢复执行。
//构造和析构
#include <iostream>
using namespace std;
void MyFunc( void );
class Expt
{
public:
Expt(){};
~Expt(){};
const char *ShowReason() const
{
return "Expt类异常。";
}
};
class Demo
{
public:
Demo();
~Demo();
};
Demo::Demo()
{
cout << "构造 Demo." << endl;
}
Demo::~Demo()
{
cout << "析构 Demo." << endl;
}
void MyFunc()
{
Demo D;
cout<< "在MyFunc()中抛掷Expt类异常。" << endl;
throw Expt();
}
int main()
{
cout << "在main函数中。" << endl;
try
{
cout << "在try块中,调用MyFunc()。" << endl;
MyFunc();
}
catch( Expt E )
{
cout << "在catch异常处理程序中。" << endl;
cout << "捕获到Expt类型异常:";
cout << E.ShowReason() << endl;
}
catch( char *str )
{
cout << "捕获到其它的异常:" << str << endl;
}
cout << "回到main函数。从这里恢复执行。" << endl;
return 0;
}//程序运行时输出:
在main函数中。
在try块中,调用MyFunc()。
构造 Demo.
在MyFunc()中抛掷Expt类异常。
析构 Demo.
在catch异常处理程序中。
捕获到Expt类型异常:Expt类异常。
回到main函数。从这里恢复执行。