C++面向对象程序设计(第二版)-第九章 异常处理

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C++面向对象程序设计
2015年2月5日星期四
9.2.2 异常处理的规则
catch子句后的复合语句用来处理由throw 表达式抛掷的异常。 当异常被抛掷以后,catch子句便依次被 检查,若某个catch子句的异常类型声明 与被抛掷的异常类型一致,则执行该段异 常处理程序。

C++面向对象程序设计
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 异常处理中的构造与析构
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.3 异常处理中的构造与析构

程序运行结果为:
在main函数中。 在try块中调用MyFunc ( ) 。 构造Demo。 在MyFunc ( ) 中抛掷Expt类异常。 析构Demo。 在catch异常处理程序中。 捕获到Expt类型异常:Expt 类异常。 程序运行回到main函数。从这里恢复执行。
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++面向对象程序设计
2015年2月5日星期四

C+Leabharlann Baidu面向对象程序设计
2015年2月5日星期四
9.2.1 异常处理的机制



如果在保护段执行期间或在保护段调用的任 何函数中有异常被抛掷,则从通过throw操作 数创建的对象中创建一个异常对象。 如果匹配的处理器未找到,则运行函数 terminate将被自动调用,而函数terminate 的默认功能是调用abort终止程序。 如果找到了一个匹配的catch处理程序,且它 通过值进行捕获,则其行参通过拷贝异常对 象进行初始化。
C++面向对象程序设计
2015年2月5日星期四
9.3 异常处理中的构造与析构

在一个程序中,找到一个匹配的catch 异常处理后,如果catch子句的异常类 型声明是一个值参数,那么在初始化时 是赋值被抛掷的异常对象。如果catch 子句的异常类型声明是一个引用,那么 在初始化时是使该引用指向异常对象。
9.2 C++异常处理的实现
9.2.1 异常处理的机制 9.2.2 异常处理的规则

C++面向对象程序设计
2015年2月5日星期四
9.2.1 异常处理的机制

C++语言提供了对处理异常情况的内部 支持。在C++语言中,try、throw和 catch语句就是用于实现异常处理的机 制。有了C++程序的异常处理机制,程 序可以向更高的执行上下文传递意想不 到的事件,使C++程序能更好地从各种 异常事件中进行有效地恢复,从而更好 地执行
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.1 异常处理的基本思想

C++的异常处理机制使得异常的引发和 处理不需要在同一函数内完成,它可以 将异常向上传播,这样底层的函数可以 专门用以解决具体问题,而上层的调用 者就可以在适当的位置针对不同类型的 异常设计处理。
C++面向对象程序设计
2015年2月5日星期四
中国水利水电出版社
C++面向对象程序设计(第二版)
主编 曹静
C++面向对象程序设计(第二版)
第九章 异常处理
第九章 异常处理
9.1 异常处理的基本思想 9.2 C++异常处理的实现 9.3 异常处理中的构造与析构

C++面向对象程序设计
2015年2月5日星期四
9.1 异常处理的基本思想
C++面向对象程序设计
2015年2月5日星期四
9.2.1 异常处理的机制

异常处理的执行过程分成以下几个步 骤:
控制通过正常的顺序执行到达try语句, 然后执行try块内的代码保护段。 如果在保护段执行期间没有引起异常,就 不执行跟在try块后的catch子句,程序从 异常被抛掷的try块后跟随的最后一个 catch子句后面的语句继续执行下去。
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 异常处理中的构造与析构

当catch子句的异常类型声明参数被初 始化,栈的展开过程便开始了。这包括 将从对应的try块开始到异常被抛掷处 之间构造且尚未析构的所有自动对象进 行析构。析构的顺序与构造的顺序相反 。程序会从最后的一个catch处理之后 开始恢复执行。
打开Project Settings对话框。 选择C / C++选项卡。 在Category栏中选择C++ language。 选择Enable Exception Handling 。

C++面向对象程序设计
2015年2月5日星期四
9.3 异常处理中的构造与析构

C++异常处理的功能较为完善,它不仅 能够处理各种不同类型的异常,而且具 有为异常抛掷前构造的所有局部对象自 动调用析构函数的能力。
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 异常处理的机制

异常处理的机制的主体有两大部分,一 是错误侦测区块,二是错误处理区块。
C++面向对象程序设计
2015年2月5日星期四
9.2.1 异常处理的机制
try { //错误侦测区块 复合语句 throw 异常类型表达式; //如果发生错误用throw语句抛出异常 } catch(异常类型1) { //错误处理区块 复合语句 } catch(异常类型2) { //错误处理区块 复合语句 } …… catch(…) // 如果在前面并没有列举异常类型,则由此处理区块处 理 { //错误处理区块 复合语句 } //try-throw-catch后继续执行
C++面向对象程序设计
2015年2月5日星期四
9.2.2 异常处理的规则

编写异常处理程序的规则是:
如果预料某段程序代码(或对某个函数的 调用)有可能发生异常,就将它放在try 子句之后。 如果某段程序中出现了自己不能处理的异 常,就可以使用throw语句来抛掷出这个 异常,将它抛掷给调用者。
C++面向对象程序设计 2015年2月5日星期四
9.2.1 异常处理的机制


try子句后的复合语句是代码的保护段。 catch子句后的复合语句是用来处理异常的程 序,处理由throw表达式抛掷的异常。 当错误侦测区块里的程序执行发生错误时, 将会利用throw语句将异常类型抛出错误侦测 区块,在对比catch语句中的异常类型后,寻 找出并执行处理该异常类型的程序区块。当 该区块执行完毕后,将继续执行catch语句后 的程序。
相关文档
最新文档