当前位置:
文档之家› C++面向对象程序设计(第二版)-第九章 异常处理
C++面向对象程序设计(第二版)-第九章 异常处理
打开Project Settings对话框。 选择C / C++选项卡。 在Category栏中选择C++ language。 选择Enable Exception Handling 。
C++面向对象程序设计
2015年2月5日星期四
9.3 异常处理中的构造与析构
C++异常处理的功能较为完善,它不仅 能够处理各种不同类型的异常,而且具 有为异常抛掷前构造的所有局部对象自 动调用析构函数的能力。
C++面向对象程序设计
2015年2月5日星期四
9.2.2 异常处理的规则
程序运行结果为:
Modulus(5,2) is 1 exception of dividing zero! end of the program
C++面向对象程序设计
2015年2月5日星期四
9.2.2 异常处理的规则
在VC++6.0环境中,为了使用异常处理 机制,需要进行以下设置:
中国水利水电出版社
C++面向对象程序设计(第二版)
主编 曹静
C++面向对象程序设计(第二版)
第九章 异常处理
第九章 异常处理
9.1 异常处理的基本思想 9.2 C++异常处理的实现 9.3 异常处理中的构造与析构
C++面向对象程序设计
2015年2月5日星期四
9.1 异常处理的基本思想
C++面向对象程序设计 2015年2月5日星期四
9.1 异常处理的基本思想
C++的异常处理机制使得异常的引发和 处理不需要在同一函数内完成,它可以 将异常向上传播,这样底层的函数可以 专门用以解决具体问题,而上层的调用 者就可以在适当的位置针对不同类型的 异常设计处理。
C++面向对象程序设计
2015年2月5日星期四
C++面向对象程序设计
2015年2月5日星期四
9.3 异常处理中的构造与析构
程序运行结果Demo。 在MyFunc ( ) 中抛掷Expt类异常。 析构Demo。 在catch异常处理程序中。 捕获到Expt类型异常:Expt 类异常。 程序运行回到main函数。从这里恢复执行。
const char *ShowReason() const { return "Expt类异常。"; } };
C++面向对象程序设计 2015年2月5日星期四
9.3 异常处理中的构造与析构
class Demo { public: Demo(); ~Demo(); }; Demo::Demo() { cout << "构造 Demo." << endl; } Demo::~Demo() { cout << "析构 Demo." << endl; }
C++面向对象程序设计
2015年2月5日星期四
9.3 异常处理中的构造与析构
当catch子句的异常类型声明参数被初 始化,栈的展开过程便开始了。这包括 将从对应的try块开始到异常被抛掷处 之间构造且尚未析构的所有自动对象进 行析构。析构的顺序与构造的顺序相反 。程序会从最后的一个catch处理之后 开始恢复执行。
C++面向对象程序设计
2015年2月5日星期四
9.2.2 异常处理的规则
编写异常处理程序的规则是:
如果预料某段程序代码(或对某个函数的 调用)有可能发生异常,就将它放在try 子句之后。 如果某段程序中出现了自己不能处理的异 常,就可以使用throw语句来抛掷出这个 异常,将它抛掷给调用者。
计算机程序在机器上运行时会产生错误 ,这些错误对于编程人员可以预料到但 却无法避免。 在一个小型程序中,一旦程序运行时发 生了异常,一般是将程序立即中断运行 ,从而无条件释放所有资源。而在一个 较为复杂的软件中,函数与函数之间存 在着各自明确的功能和相互间复杂的调 用关系,发现错误的函数又并不具备处 理错误的能力。
C++面向对象程序设计
2015年2月5日星期四
C++面向对象程序设计 2015年2月5日星期四
9.2.1 异常处理的机制
try子句后的复合语句是代码的保护段。 catch子句后的复合语句是用来处理异常的程 序,处理由throw表达式抛掷的异常。 当错误侦测区块里的程序执行发生错误时, 将会利用throw语句将异常类型抛出错误侦测 区块,在对比catch语句中的异常类型后,寻 找出并执行处理该异常类型的程序区块。当 该区块执行完毕后,将继续执行catch语句后 的程序。
C++面向对象程序设计
2015年2月5日星期四
9.3 异常处理中的构造与析构
在一个程序中,找到一个匹配的catch 异常处理后,如果catch子句的异常类 型声明是一个值参数,那么在初始化时 是赋值被抛掷的异常对象。如果catch 子句的异常类型声明是一个引用,那么 在初始化时是使该引用指向异常对象。
C++面向对象程序设计
2015年2月5日星期四
9.3 异常处理中的构造与析构
void MyFunc() { Demo D; cout<< "在MyFunc()中抛掷Expt类异常。" << endl; throw Expt(); } int main() { cout << "在main函数中。" << endl; try { cout << "在try块中,调用MyFunc()。" << endl; MyFunc(); }
C++面向对象程序设计
2015年2月5日星期四
9.2.2 异常处理的规则
catch子句后的复合语句用来处理由throw 表达式抛掷的异常。 当异常被抛掷以后,catch子句便依次被 检查,若某个catch子句的异常类型声明 与被抛掷的异常类型一致,则执行该段异 常处理程序。
C++面向对象程序设计
2015年2月5日星期四
9.2.2 异常处理的规则
例:处理除零异常
#include <iostream> using namespace std; int try_modulus(int,int); void main() { try //代码保护段 { cout<<"Modulus(5,2) is "<<try_modulus(5,2)<<endl; cout<<"Modulus(3,0) is "<<try_modulus(3,0)<<endl; cout<<"Modulus(8,5) is "<<try_modulus(8,5)<<endl; } catch(char *s) //处理异常 { cerr<<s; } cout<<"end of the program.\n"; } int try_modulus(int x,int y) { if(y==0) //检查被除数是否为零,是则抛出异常 throw("exception of dividing zero!\n"); return x%y; }
C++面向对象程序设计
2015年2月5日星期四
9.3 异常处理中的构造与析构
例:使用带析构语义的类的C++异常处理
#include <iostream> using namespace std; void MyFunc(void); class Expt { public: Expt(){}; ~Expt(){};
C++面向对象程序设计
2015年2月5日星期四
9.3 异常处理中的构造与析构
catch( Expt E ) { cout << "在catch异常处理程序中。" << endl; cout << "捕获到Expt类型异常:"; cout << E.ShowReason() << endl; } catch( char *str ) { cout << "捕获到其它的异常:" << str << endl; } cout << "回到main函数。从这里恢复执行。" << endl; return 0; }
C++面向对象程序设计
2015年2月5日星期四
9.2.1 异常处理的机制
如果在保护段执行期间或在保护段调用的任 何函数中有异常被抛掷,则从通过throw操作 数创建的对象中创建一个异常对象。 如果匹配的处理器未找到,则运行函数 terminate将被自动调用,而函数terminate 的默认功能是调用abort终止程序。 如果找到了一个匹配的catch处理程序,且它 通过值进行捕获,则其行参通过拷贝异常对 象进行初始化。
C++面向对象程序设计
2015年2月5日星期四
9.2.1 异常处理的机制
异常处理的执行过程分成以下几个步 骤: