面向对象程序设计第十二章异常处理机制.ppt

上传人:小飞机 文档编号:6613310 上传时间:2023-11-18 格式:PPT 页数:31 大小:426KB
返回 下载 相关 举报
面向对象程序设计第十二章异常处理机制.ppt_第1页
第1页 / 共31页
面向对象程序设计第十二章异常处理机制.ppt_第2页
第2页 / 共31页
面向对象程序设计第十二章异常处理机制.ppt_第3页
第3页 / 共31页
面向对象程序设计第十二章异常处理机制.ppt_第4页
第4页 / 共31页
面向对象程序设计第十二章异常处理机制.ppt_第5页
第5页 / 共31页
点击查看更多>>
资源描述

《面向对象程序设计第十二章异常处理机制.ppt》由会员分享,可在线阅读,更多相关《面向对象程序设计第十二章异常处理机制.ppt(31页珍藏版)》请在三一办公上搜索。

1、第10章 异常处理机制,本章主要内容:,异常处理的任务与思想 异常处理的实现 异常处理的应用 异常处理中的构造与析构 C+标准异常类,10.1 异常处理的任务与思想,软件不仅要保证能正确完成任务,还应当具有良好的容错性。容错性是指软件不仅在正确操作的条件下能正确运行,而且当环境异常或不当使用时,依然能合理处理运行过程中的出现的各种异常,而不会产生各种意想不到的后果。程序中的各种异常通过分析完全可以预料。根据异常的不同情况进行对异常进行处理,如给出提示信息、允许用户排除环境错误、继续运行程序等都是异常处理的基本任务。,1.传统的异常处理方法,传统程序设计方法中,通常采用系统提供的中断函数或指令。

2、当被调用函数发生异常或产生错误时,返回一个特定的值,以便调用函数检测错误标志,并作出处理;或当错误产生时,释放所有资源,结束程序运行,常用中断函数或指令,#include double div(double,double);void main()double x,y;couty;coutx;if(x=0)coutDivided by zero,Error!endl;else coutq=div(x,y)endl;coutEnd of the program.endl;double div(double x,double y)return y/x;,传统异常处理方法的优点是异常处理直接,系统运行

3、开销少,适用于处理简单的局部错误与异常。不足之处是异常处理代码分布于程序中可能出错的各个地方,异常处理代码与系统功能实现代码混在一起,降低程序的可读性与可维护性,不适合大型软件的开发,也不符合现代软件工程的理念,2.C+异常处理机制,在大型软件中,由于函数之间具有各自明确的分工并可能存在调用关系,发生错误的函数可能不便于或不具备处理错误的条件。C+异常处理机制的基本思想是将异常检测与异常处理分离。产生异常的函数不一定需要具备异常处理的能力,当一个函数发生异常时,它抛出所发生的异常或错误,由调用者捕获或处理异常,若上层调用函数仍不便于处理异常,还可以进一步抛出异常,按调用层次关系传递给更上一层处

4、理。,2.C+异常处理机制,10.2 C+异常处理的实现,C+语言提供了对异常处理机制的内部支持由try、throw和catch语句提供了C+用于实现异常处理的机制。在异常处理机制的支持下,可以更合理、更有效的处理程序运行过程中存在的各种异常现象。,1.异常处理的语法,try-throw-catch是C+异常处理机制的实现语句;程序中可能产生异常的部分应包含于try块之中;异常由紧随其后的catch语句捕获和处理;throw语句的作用是抛出异常。,异常处理程序的使用形式,try语句块实际上是程序代码的保护段,表明该程序段在执行过程中可能会产生异常或出现错误;若预料某段程序代码或某个函数可能发生

5、异常或错误,就应当将之置于try语句块之内;一旦该代码段或函数在调用过程中产生了异常情况,throw语句将抛出这个异常,并通过throw之后的表达式返回一个值;,有关说明,当函数出现了自己不能处理的异常,就可以使用“throw 表达式”将异常抛出;throw之后的“表达式”表示异常类型,它在语法上与return语句的“表达式”值类似;throw语句表达式的值不能用来区分不同异常,所以当程序将要抛出多个异常,应该用不同类型的表达式值相互区别;,有关说明(续),catch语句块是异常处理的程序代码,捕获和处理由“throw 表达式”所抛出的异常。catch 之后的异常类型可以是任何有效的数据类型,

6、它与函数的形参类似,既可以是 int、float等某个类型值,也可以是引用及C+的类,它用于指定catch语句块所处理的异常的类型;当异常被抛出后,catch块依次被检查,若某catch语句块的异常类型与被抛出的异常类型一致,则执行该异常处理程序段。,有关说明(续),在一个try语句块内,异常处理程序将按照它出现的位置先后顺序进行检查。若找到一个匹配的异常类型,后面的异常处理都将被忽略;如果异常类型声明是一个省略号(),则表示catch语句可以处理任何类型的异常;类型为省略号的catch处理程序必须是try块的最后一段处理程序。,有关说明(续),double div(double x,doub

7、le y)if(x=0)throw y;/若x=0时,抛出异常return y/x;,#include double div(double,double);void main()double x,y;try/try语句块couty;coutx;coutq=div(x,y)endl;catch(double)/捕获异常coutDivided by zero,Error!endl;coutEnd of the program.endl;,异常处理的执行过程,通过正常的执行顺序直到try语句,然后执行try块内的保护段。若保护段在执行期间没有产生异常,则try语句块后的catch块不会被执行,程序从

8、最后一个catch语句块后面的语句继续执行。,异常处理的执行过程(续),若保护段在执行期间或保护段调用的任何函数中(直接或间接的调用)有异常抛出,则从通过throw操作数创建的对象中创建一个异常对象。然后寻找catch语句块或一个能处理任何类型异常的catch处理块。catch语句块按其出现的顺序被检查,如果没有匹配的catch处理块,则继续检查下一个动态封闭的try块,直到最外层的封闭try块被检查完。,异常处理的执行过程(续),若没有匹配的catch处理块,则terminate函数将被自动调用,而terminate函数的默认功能是调用abort函数终止程序。若有匹配的catch处理块,如果

9、它通过值进行捕获,则其形参通过复制异常对象进行初始化。如果它通过引用进行捕获,则参量被初始化为指向异常对象。在形参被初始化之后,对那些在与catch处理器相对应的try块开始和异常抛出点之间创建、但尚未析构的所有自动对象进行析构,然后执行catch处理程序。,多种异常的检测。#include double judgement(char*ptr,int ag,double sal);void main()char name20;double salary;int age;coutname;coutage;coutsalary;if(judgement(name,age,salary)coutna

10、me=nameendl;coutage=ageendl;coutsalary=salaryendl;coutEnd of the program.endl;,double judgement(char*ptr,int ag,double sal)bool logic;logic=true;tryif(a16)throw ag;if(s530)throw sal;catch(int ag)logic=false;cout职工年龄小于16岁,违反劳动法!agendl;catch(double sal)logic=false;cout工资低于本市最低工资530元,违反劳动!salendl;retur

11、n logic;,C+程序设计中经常发生函数调用,在调用函数时除需要了解函数参数值和返回值类型之外,当函数有异常抛出时,还需要知道函数抛出异常的方式,以方便调用函数(主调函数)对异常进行处理.函数异常接口的声明进一步提高了程序的可读性。异常的抛出、捕获与处理已经成为函数接口的一部分,因此,在函数原型中需要指定函数可以抛出的异常类型。,2.异常处理接口,指定异常类型类型 函数名(参数表)throw(A1,A2,An);函数原型声明表明可以抛出的异常类型为A1,A2,An及这些类型的子类型异常。,指定函数所抛出的异常的形式:,指定函数所抛出的异常的形式(续),2.抛出任意类型异常类型 函数名(参数

12、表);函数原型没有throw的说明,该函数可以抛出任意类型的异常。,指定函数所抛出的异常的形式(续),3.不抛出异常类型 函数名(参数表)throw();throw之后是一个空表,该函数原型声明表示该函数不抛出任何类型的异常。,C+异常处理机制不仅能处理各种不同类型的异常,而且能处理构造函数异常,即具有为抛出异常前构造的所有局部对象自动调用析构函数的能力。,3.异常处理中的构造与析构,#include void TestFun();class TestA public:TestA()coutConstructing TestA.endl;TestA()coutDestructing TestA

13、endl;void Display()coutClass TestA Exception!endl;class TestBpublic:TestB();TestB();TestB:TestB()coutConstructing TestBendl;,TestB:TestB()coutDestructing TestBendl;void TestFun()TestB tb;coutThrow TestA Exception!endl;throw TestA();void main()coutNow Enter main()endl;try coutNow Call TestFun()endl;T

14、estFun();catch(TestA ta)coutAn TestA Exception Occurred!endl;ta.Display();catch(.)coutOther Exception Occurred!endl;coutReturn main()endl;,C+标准库提供了包括exception类在内的9个标准异常类 exception类是异常类的基类,该类的成员函数都包含一个没有指定异常列表的throw()。:,10.4 C+标准异常类,exception框架代码,class exceptionpublic:exception()throw();exception(con

15、st exception,异常类exception中含有成员函数what(),该函数可以被exception类及该类的其他派生类重载,用于返回一个描述异常的字符串常量。,其他异常处理类,#include#includeusing namespace std;void main()tryexception exceptionError;/声明一个C+标准异常类对象throw(exceptionError);catch(const exception/调用what()成员函数显示错误原因,tryrange_error rangeError(RangeError!);throw(rangeError);catch(const exception,练习试用try,catch和throw语句实现求解实系数一元二次方程的实数根。1.系数自行输入2.a=0时抛出异常二次项系数异常,catch语句块捕获异常并进行提示:该方程不是二次方程3.当方程没有实数根式产生异常,有throw抛出无实数根异常,catch语句块捕获异常并进行提示:该方程没有实数根;,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号