第十九章 异常.doc

上传人:M****1 文档编号:543337025 上传时间:2022-11-20 格式:DOC 页数:4 大小:31KB
返回 下载 相关 举报
第十九章 异常.doc_第1页
第1页 / 共4页
第十九章 异常.doc_第2页
第2页 / 共4页
第十九章 异常.doc_第3页
第3页 / 共4页
第十九章 异常.doc_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《第十九章 异常.doc》由会员分享,可在线阅读,更多相关《第十九章 异常.doc(4页珍藏版)》请在金锄头文库上搜索。

1、面向对象的程序设计第十九章 异常第十九章 异常程序的异常在一些非常的但是可以预知的错误(内存或磁盘空间的耗尽)发生时出现。在C+中,异常是指从发生问题的代码区域传递到处理问题的区域的一个对象。异常处理的主要问题是我们什么时候、怎么样来产生这样一个异常对象,并对这个异常对象进行处理。1. try,catch和throw语句我们通过这单个语句来实现由底层向更高的执行上下文传递意想不到的事件,这些上下文能更好地从这些异常事件中恢复过来。这些异常由正常控制流外的代码进行处理。语法try块:try复合语句 处理器表处理器表: 处理器 处理器表opt处理器: catch(异常说明) 复合语句异常说明: 类

2、型指示符表 说明符 类型指示符表 抽象说明符 类型指示符表 .throw-表达式: throw 赋值表达式2. 异常代码段的执行过程:(1) 顺序执行到达try语句,try块内代码被执行。(2) 如果在try块内代码执行期间没有引起异常,跟在try块后的catch子句不执行。从异常被扔出的try块后跟随的最后一个catch子句后面的语句继续执行下去。(3) 如果在try块内代码执行期间或在try块内代码调用的任何例行程序中(直接或间接的调用)有异常被扔出,则从通过throw操作数创建的对象中创建一个异常对象。编译器寻找一个catch子句catch处理程序按其在try块后出现的顺序被检查。如果没

3、有找到合适的处理器,则下一个动态封闭的try块被检查。直至最外层封闭try块。(4) 如果没有找到匹配的处理器,则运行预定义的函数terminate。如果一个异常发生在扔出异常之后,则在循环展开开始之前调用terminate。(5) 一个匹配的catch处理器捕获异常对象。下面是一个处理new运算符可能出现的异常的例子:程序19.1#include int main() char *buf; try buf=new char512; if(buf=0) throw Memory allocation failure!; catch (char *str) cout Exception rais

4、ed: str endl; /. return 0;注意:h try语句块用于包围可能出现问题的代码。h throw语句扔出一个某种类型的异常。h catch语句块接受相应类型的异常。h 异常说明(char*)语句指示子句处理的异常的类型,类型可以是任何有效的数据类型,包括C+的类。如果异常说明语句是一个省略号(.),catch子句处理任何类型的异常,包括C的异常。这样的处理器必须是其try块的最后一个处理器。我们可以添加一个catch块:catch(.)cout Exception default process: endl;C+异常处理不仅可以处理各种不同类型的异常,还可以在堆栈循环展开期

5、间为异常丢弃前构造的所有局部对象自动调用析构函数。以下例子演示带析构语义的类的C+异常处理:程序19.2#include void MyFunc(void);class CTestpublic: CTest() ; CTest() ; const char *ShowReason() const return Exception in CTest class.; ;class CDtorDemopublic: CDtorDemo(); CDtorDemo();CDtorDemo:CDtorDemo() cout Constructing CDtorDemo endl;CDtorDemo:CDt

6、orDemo() cout Destructing CDtorDemo endl;void MyFunc() CDtorDemo D; cout In MyFunc().Throwing CTest exception. endl; throw CTest();int main() cout In main. endl; try cout In try block, calling MyFunc(). endl; MyFunc(); catch(CTest E) cout In catch handler.n; cout Caught CTest exception type:; cout E

7、.ShowReason() endl; catch(char* str) cout Caught some other exception: str endl; cout Back in main. Exception resumes here.n; return 0;程序输出结果: In main. In try block, calling MyFunc(). Constructing CDtorDemo In MyFunc().Throwing CTest exception. Destructing CDtorDemo In catch handler. Caught CTest ex

8、ception type:Exception in CTest class. Back in main. Exception resumes here.异常的传递:一个不带操作数的throw表达式把当前正被处理的异常再次丢弃,这样一个表达式仅仅应该出现在一个catch处理器中或从catch处理器内部被调用的函数中,再次丢弃的异常对象是源异常对象(不是拷贝)。例如:try throw CSomeOtherException();catch(.) /处理所有异常/ 对异常作出响应(也许仅仅是部分的) /. throw; / 将异常传给某个其它处理器未处理的异常如果为当前的异常找不到匹配的处理器(或

9、省略的catch处理器),则预定义的terminate函数被调用(也可以在处理器中显式地调用terminate)。terminate的缺省动作是调用abort,如果你想要terminate在退出应用之前调用你程序中的某个其它的函数,用待调用的函数名作为单个参量去调用set_terminate函数。你可在你程序中的任何地方调用set_terminate。terminate例程总是调用给定的最后一个函数作为set_terminate的一个参量。例如:程序19.3term_func函数应该终止程序或当前的线程,理想地是通过调用exit。如果它没有且是返回其调用者,则abort被调用。第 4 页 共 1 页

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号