资源预览内容
第1页 / 共40页
第2页 / 共40页
第3页 / 共40页
第4页 / 共40页
第5页 / 共40页
第6页 / 共40页
第7页 / 共40页
第8页 / 共40页
第9页 / 共40页
第10页 / 共40页
亲,该文档总共40页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第十章 异常处理大型和十分复杂的程序往往会产生一些很难查找的甚至是 无法避免的运行时错误。当发生运行时错误时,不能简单地结 束程序运行,而是退回到任务的起点,指出错误,并由用户决 定下一步工作。面向对象的异常处理(exception handling) 机制是C+语言用以解决这个问题的有力工具。函数执行时,放在try(测试)程序块中的任何类型的数 据对象发生异常,都可被throw表达式抛出,随即逆调用链退 回,直到被catch子句捕获,并在此执行异常处理,报告出现 的异常等情况。从抛出到捕获,应将各嵌套调用函数残存在 栈中的自动对象、自动变量和现场保护内容等进行清除。如 果已退到入口函数还未捕获则由terminate()函数来终结入口 函数。第十章 异常处理10.1 异常的概念 10.3 栈展开与 异常捕获10.2 异常处理的机制 10.5异常和继承 10.7 C+标准库异常类层次结构 (选读)10.6异常规范(选读)10.4 异常的重新抛出和catch_all子句 10.1 异常的概念 异常概念的引入: 异常(exception)是程序可能检测到的,运行时不正常的情况,如存储空间耗尽、数组越 界、被0除等等。可以预见可能发生在什么地方,但是无法确 知怎样发生和何时发生。特别在一个大型的程序(软件)中, 程序各部分是由不同的小组编写的,它们由公共接口连起来, 错误可能就发生在相互的配合上,也可能发生在事先根本想不 到的个别的条件组合上。C+提供了一些内置的语言特性来产生(raise)或抛出( throw)异常,用以通知“异常已经发生”,然后由预先安排的 程序段来捕获(catch)异常,并对它进行处理。这种机制可 以在C+程序的两个无关(往往是独立开发)的部分进行“异常 ”通信。由程序某一部分引发了另一部分的异常,这一异常可回 到引起异常的部分去处理(逆着程序函数的调用链)。10.2 异常处理的机制测到栈满或空就抛出一个异常。 template void Stack:Push(const T/注意加了括号,是构造一个无名对象elements+top=data; templateT Stack:Pop()if(IsEmpty() throw popOnEmpty();return elementstop-; 注意pushOnFull是类,C+要求抛出的必须是对象,所以必 须有“()”,即调用构造函数建立一个对象。异常与异常抛出: 以栈为例,异常类声明如下: class popOnEmpty.; /栈空异常 class pushOnFull.; /栈满异常10.2 异常处理的机制throw表达式抛出异常为异常处理的第一步。在堆栈的压 栈和出栈操作中发生错误而抛出的异常,理所当然地应由 调用堆栈的程序来处理。异常并非总是类对象,throw表 达式也可以抛出任何类型的对象,如枚举、整数等等。但 最常用的是类对象。在C+中异常抛出与异常处理之间有一整套程序设计的机制 。首先采用关键字try,构成一个try块(try block),它包 含了抛出异常的语句。当然也可以是包含了这样的调用语句 ,该语句所调用的函数中有能够抛出异常的语句。异常处理机制:10.2 异常处理的机制int main()int a9=1,2,3,4,5,6,7,8,9,b9=0,i;stackistack(8);try for(i=0;i)cerr)cerrclass pushOnFullT _value; public:pushOnFull(T i):_value(i) /或写为pushOnFull(T i)_value=i;T value()return _value; ; 新的私有数据成员_value保存那些不能被压入栈中的值。该 值即调用构造函数时的实参。catch子句异常声明探讨: 异常声明中可以是一个对象声明。以栈为例。当栈满 时,要求在异常对象中保存不能被压入到栈中的值, pushOnFull类可定义如下:10.3 栈展开与异常捕获在catch子句中,要取得_value,须调用pushOnFull 中的成员函数value(): catch(pushOnFull eObj)cerr public: pushOnFull(T i)_value=i; T value()return _value; void print()cerrclass popOnEmpty/栈空异常声明 public: void print()cerrclass Stack int top; /栈顶指针(下标) T *elements; /动态建立的数值 int maxSize; /栈最大允纳的元素个数 public: Stack(int=20); /栈如不指定大小,设为20元素 Stack()delete elements; void Push(const T /压栈 T Pop() throw(popOnEmpty); /弹出,top T GetElem(int i)return elementsi; /返回指定元素 void MakeEmpty()top= 1; /清空栈 bool IsEmpty() constreturn top= 1; /判栈空 bool IsFull() constreturn top=maxSize1; /判栈满 void PrintStack(); /输出栈内所有数据 ;例10.1 堆栈异常处理template void Stack:Push(const T /栈满则抛出异常 elements+top=data;/栈顶指针先加1,元素再进栈,top是指向栈顶元素 templateT Stack:Pop() if(IsEmpty() throw popOnEmpty();/栈已空则不能退栈,抛出异常 return elementstop;/返回栈顶元素,同时栈顶指针退1 例10.1 堆栈异常处理int main() int a9=1,2,3,4,5,6,7,8,9, b9=0,i; Stackistack(8); try for(i=0;i tryfor(i=0;i for(i=0;i istack(8); for(i=0;i return 1; catch(popOnEmpty return 2;例10.2 异常层次结构中的虚函数class Excp public: virtual void print()cerrclass Array int size;elemType * ia ; public: explicit Array(int sz=DefaultArraySize) size=sz;ia=new elemType size; Array()delete ia; elemType throw out_of_range(eObj); return iaix; /保留原来 的所有索引方式 private: int size;elemType * ia; ;例10.3 Array重新定义下标操作符 int main() int i; Array arr; try for(i=0;i:operator()“ return 1; return 0;
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号