第十二章 异常处理
清华大学计算机与信息管理中心
郑 莉
C++语言程序设计
前一页 休息
本章主要内容
? 异常处理的基本思想
? C++异常处理的实现
? 异常处理中的构造与析构
前一页 休息
异常处理的基本思想
函数 f()捕获并处理异常
函数 h() 引发异常
函数 g()
……
调用者
异常传播方向调用关系
前一页 休息
异常处理的实现
? 抛掷异常的程序段
......
throw 表达式 ;
......
? 捕获并处理异常的
程序段
try
复合语句
catch(异常类型声明)
复合语句
catch(异常类型声明)
复合语句

? 控制通过正常的顺
序执行到达 try语句,
然后执行 try块内的
保护段。
? 如果在保护段执行
期间没有引起异常,
那么跟在 try块后的
catch子句就不执行。
程序从 try块后跟随
的最后一个 catch子
句后面的语句继续
执行下去。
? 若有异常则从通过
throw操作创建一个
异常对象并抛掷。
?catch子句按其在 try
块后出现的顺序被检
查。匹配的 catch子句
将捕获并处理异常
(或继续抛掷异常)。
?如果匹配的处理器未
找到,则运行函数
terminate将被自动调
用,其缺省功能是调
用 abort终止程序。
前一页 休息
例 12-1处理除零异常
#include<iostream.h>
int Div(int x,int y);
void 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,D);
? 若无异常接口声明,则此函数可以抛
掷任何类型的异常。
? 不抛掷任何类型异常的函数声明如下:
void fun() throw();
前一页 休息
异常处理中的构造与析构
? 找到一个匹配的 catch异常处理后:
–初始化参数。
–将从对应的 try块开始到异常被抛掷
处之间构造(且尚未析构)的,所
有自动对象进行析构。
–从最后一个 catch处理之后开始恢复
执行。
前一页 休息
例 12-2 异常处理时的析构
#include <iostream.h>
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函数。从这里恢复执行。
前一页 休息
作业
? 复习第 12章,预习第 13章
? 12.4
? 实验 12