C++——异常处理

程序的异常处理是使得程序具有一定的容错性,是指允许给运行环境或者人为因素的一些错误的提示或处理。其基本思想:每一个函数要负责发现异常,不必去处理错误,但是需要构造一个异常对象向调用者抛出该异常。该调用者查看异常对象,判断是否能够解决,给用户提示;如果处理不了,则需要继续向更上一级的调用者抛出异常,如此类推,直至抛掷给操作系统,终止程序。主要见下图:

25、异常处理
异常处理的实现机制:提示异常并捕获处理异常。

抛弃异常的程序: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函数。从这里恢复执行。

posted @ 2019-01-08 11:36  lemaden  阅读(270)  评论(0编辑  收藏  举报