《面向对象程序设计第十二章异常处理机制精选文档.ppt》由会员分享,可在线阅读,更多相关《面向对象程序设计第十二章异常处理机制精选文档.ppt(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、面向对象程序设计第十二章异常处理机制本讲稿第一页,共二十九页 本章主要内容:本章主要内容:异常处理的任务与思想异常处理的任务与思想异常处理的实现异常处理的实现异常处理的应用异常处理的应用异常处理中的构造与析构异常处理中的构造与析构C+标准异常类标准异常类本讲稿第二页,共二十九页10.1 异常处理的任务与思想异常处理的任务与思想 软软件件不不仅仅要要保保证证能能正正确确完完成成任任务务,还还应应当当具具有有良良好的好的容错性容错性。容容错错性性是是指指软软件件不不仅仅在在正正确确操操作作的的条条件件下下能能正正确确运运行行,而而且且当当环环境境异异常常或或不不当当使使用用时时,依依然然能能合合理
2、理处处理理运运行行过过程程中中的的出出现现的的各各种种异异常常,而而不不会会产产生生各各种种意意想想不到的后果。不到的后果。程序中的各种异常通过分析完全可以预料程序中的各种异常通过分析完全可以预料。根根据据异异常常的的不不同同情情况况进进行行对对异异常常进进行行处处理理,如如给给出出提提示示信信息息、允允许许用用户户排排除除环环境境错错误误、继继续续运运行行程程序序等等都是异常处理的基本任务。都是异常处理的基本任务。本讲稿第三页,共二十九页1.传统的异常处理方法传统的异常处理方法 传统程序设计方法中,通常采用系统提供的中断函传统程序设计方法中,通常采用系统提供的中断函数或指令。数或指令。当被调
3、用函数发生异常或产生错误时,返回一个特定当被调用函数发生异常或产生错误时,返回一个特定的值,以便调用函数检测错误标志,并作出处理;的值,以便调用函数检测错误标志,并作出处理;或当错误产生时,释放所有资源,结束程序运行或当错误产生时,释放所有资源,结束程序运行本讲稿第四页,共二十九页常用中断函数或指令常用中断函数或指令 函数原型函数原型/指令指令功功能能头文件头文件voidabort()中断程序执行,返回主中断程序执行,返回主C+窗口窗口stdlib.hvoidassert(表达式表达式)若表达式的值为若表达式的值为false则中断程序执行,则中断程序执行,并显示中断所在的文件和所在行号并显示中
4、断所在的文件和所在行号assert.hvoidexit(状态状态)中断程序执行,返回退出代码(状态中断程序执行,返回退出代码(状态值)值)stdlib.hreturn表达式表达式终止函数执行终止函数执行,返回表达式的值返回表达式的值本讲稿第五页,共二十九页l#includeldoublediv(double,double);lvoidmain()lldoublex,y;lcouty;lcoutx;lif(x=0)lcoutDividedbyzero,Error!endl;lelsellcoutq=div(x,y)endl;llcoutEndoftheprogram.endl;lldoubled
5、iv(doublex,doubley)llreturny/x;l传统异常处理方法的优点是异常处传统异常处理方法的优点是异常处理直接,系统运行开销少,适用于理直接,系统运行开销少,适用于处理简单的局部错误与异常。处理简单的局部错误与异常。不足之处是异常处理代码分布于不足之处是异常处理代码分布于程序中可能出错的各个地方,异程序中可能出错的各个地方,异常处理代码与系统功能实现代码常处理代码与系统功能实现代码混在一起,降低程序的可读性与混在一起,降低程序的可读性与可维护性,不适合大型软件的开可维护性,不适合大型软件的开发,也不符合现代软件工程的理发,也不符合现代软件工程的理念念本讲稿第六页,共二十九页
6、2.C+异常处理机制异常处理机制在在大大型型软软件件中中,由由于于函函数数之之间间具具有有各各自自明明确确的的分分工工并并可可能能存存在在调调用用关关系系,发发生生错错误误的的函函数数可可能能不不便便于于或或不不具具备备处理错误的条件。处理错误的条件。C+异异常常处处理理机机制制的的基基本本思思想想是是将将异异常常检检测测与与异异常常处处理理分分离离。产产生生异异常常的的函函数数不不一一定定需需要要具具备备异异常常处处理理的的能能力力,当当一一个个函函数数发发生生异异常常时时,它它抛抛出出所所发发生生的的异异常常或或错错误误,由由调调用用者者捕捕获获或或处处理理异异常常,若若上上层层调调用用函
7、函数数仍仍不不便便于于处处理理异异常常,还还可可以以进进一步抛出异常,按调用层次关系传递给更上一层处理。一步抛出异常,按调用层次关系传递给更上一层处理。本讲稿第七页,共二十九页2.C+异常处理机制异常处理机制函数函数f()f()捕获并处理异常捕获并处理异常函数函数h()h()引发异常引发异常函数函数g()g()调用者调用者异常传播方向异常传播方向调用关系调用关系本讲稿第八页,共二十九页10.2 C+异常处理的实现异常处理的实现 C+语言提供了对异常处理机制的内部支持语言提供了对异常处理机制的内部支持由由try、throw和和catch语句提供了语句提供了C+用于实现异用于实现异常处理的机制。常
8、处理的机制。在异常处理机制的支持下,可以更合理、更有效在异常处理机制的支持下,可以更合理、更有效的处理程序运行过程中存在的各种异常现象。的处理程序运行过程中存在的各种异常现象。本讲稿第九页,共二十九页1.异常处理的语法异常处理的语法try-throw-catch是是C+异常处理机制的实现语句;异常处理机制的实现语句;程序中可能产生异常的部分应包含于程序中可能产生异常的部分应包含于try块之中;块之中;异常由紧随其后的异常由紧随其后的catch语句捕获和处理;语句捕获和处理;throw语句的作用是抛出异常。语句的作用是抛出异常。本讲稿第十页,共二十九页异常处理程序的使用形式异常处理程序的使用形式
9、try语句;语句;catch(类型类型1参数参数1)与类型与类型1相关的异常处理语句;相关的异常处理语句;catch(类型类型2参数参数2)与类型与类型2相关的异常处理语句;相关的异常处理语句;catch(类型类型n参数参数n)与类型与类型n相关的异常处理语句;相关的异常处理语句;throw表达式使用格式如下:表达式使用格式如下:throw表达式;表达式;本讲稿第十一页,共二十九页 try try语句块实际上是程序代码的保护段,表明该程序语句块实际上是程序代码的保护段,表明该程序段在执行过程中可能会产生异常或出现错误;段在执行过程中可能会产生异常或出现错误;若预料某段程序代码或某个函数可能发生
10、异常或错误,就若预料某段程序代码或某个函数可能发生异常或错误,就应当将之置于应当将之置于trytry语句块之内;语句块之内;一旦该代码段或函数在调用过程中产生了异常情况,一旦该代码段或函数在调用过程中产生了异常情况,throwthrow语句将抛出这个异常,并通过语句将抛出这个异常,并通过throwthrow之后的表达式返之后的表达式返回一个值;回一个值;有关说明有关说明本讲稿第十二页,共二十九页当函数出现了自己不能处理的异常,就可以使用当函数出现了自己不能处理的异常,就可以使用“throw throw 表达式表达式”将异常抛出;将异常抛出;throwthrow之后的之后的“表达式表达式”表示异
11、常类型,它在语法上与表示异常类型,它在语法上与returnreturn语句的语句的“表达式表达式”值类似;值类似;throwthrow语句表达式的值不能用来区分不同异常,所以语句表达式的值不能用来区分不同异常,所以当程序将要抛出多个异常,应该用不同类型的表达式值当程序将要抛出多个异常,应该用不同类型的表达式值相互区别;相互区别;有关说明有关说明(续续)本讲稿第十三页,共二十九页catchcatch语句块是异常处理的程序代码,捕获和处理由语句块是异常处理的程序代码,捕获和处理由“throw表达式表达式”所抛出的异常。所抛出的异常。catch catch 之后的异常类型可以是任何有效的数据类型,它
12、与之后的异常类型可以是任何有效的数据类型,它与函数的形参类似,既可以是函数的形参类似,既可以是 intint、floatfloat等某个类型值,也等某个类型值,也可以是引用及可以是引用及C+C+的类,它用于指定的类,它用于指定catchcatch语句块所处理的语句块所处理的异常的类型;异常的类型;当异常被抛出后,当异常被抛出后,catchcatch块依次被检查块依次被检查 ,若某,若某catchcatch语句语句块的异常类型与被抛出的异常类型一致,则执行该异常处块的异常类型与被抛出的异常类型一致,则执行该异常处理程序段。理程序段。有关说明有关说明(续续)本讲稿第十四页,共二十九页在一个在一个t
13、rytry语句块内,异常处理程序将按照它出现语句块内,异常处理程序将按照它出现的位置先后顺序进行检查。若找到一个匹配的异常类的位置先后顺序进行检查。若找到一个匹配的异常类型,后面的异常处理都将被忽略;型,后面的异常处理都将被忽略;如果异常类型声明是一个省略号如果异常类型声明是一个省略号()(),则表示,则表示catchcatch语句可以处理任何类型的异常;语句可以处理任何类型的异常;类型为省略号的类型为省略号的catchcatch处理程序必须是处理程序必须是trytry块的最后一块的最后一段处理程序。段处理程序。有关说明有关说明(续续)本讲稿第十五页,共二十九页doublediv(double
14、x,doubley)if(x=0)throwy;/若若x=0时时,抛出异常抛出异常returny/x;#includedoublediv(double,double);voidmain()doublex,y;try/try语句块语句块couty;coutx;coutq=div(x,y)endl;catch(double)/捕获异常捕获异常coutDividedbyzero,Error!endl;coutEndoftheprogram.endl;本讲稿第十六页,共二十九页异常处理的执行过程异常处理的执行过程 通过正常的执行顺序直到通过正常的执行顺序直到try语句,然后执行语句,然后执行try块内
15、的保护段。块内的保护段。若保护段在执行期间没有产生异常,则若保护段在执行期间没有产生异常,则try语语句块后的句块后的catch块不会被执行,程序从最后一个块不会被执行,程序从最后一个catch语句块后面的语句继续执行。语句块后面的语句继续执行。本讲稿第十七页,共二十九页异常处理的执行过程异常处理的执行过程(续续)若保护段在执行期间或保护段调用的任何函若保护段在执行期间或保护段调用的任何函数中数中(直接或间接的调用直接或间接的调用)有异常抛出,则从通过有异常抛出,则从通过throw操作数创建的对象中创建一个异常对象。然操作数创建的对象中创建一个异常对象。然后寻找后寻找catch语句块或一个能处
16、理任何类型异常语句块或一个能处理任何类型异常的的catch处理块。处理块。catch语句块按其出现的顺序被检语句块按其出现的顺序被检查,查,如果没有匹配的如果没有匹配的catch处理块,则继续检查下处理块,则继续检查下一个动态封闭的一个动态封闭的try块,直到最外层的封闭块,直到最外层的封闭try块被块被检查完。检查完。本讲稿第十八页,共二十九页异常处理的执行过程异常处理的执行过程(续)若没有匹配的若没有匹配的catch处理块,则处理块,则terminate函数函数将被自动调用,而将被自动调用,而terminate函数的默认功能是调函数的默认功能是调用用abort函数终止程序。函数终止程序。若
17、有匹配的若有匹配的catch处理块,如果它通过值进行处理块,如果它通过值进行捕获,则其形参通过复制异常对象进行初始化。捕获,则其形参通过复制异常对象进行初始化。如果它通过引用进行捕获,则参量被初始化为如果它通过引用进行捕获,则参量被初始化为指向异常对象。在形参被初始化之后,对那些指向异常对象。在形参被初始化之后,对那些在与在与catch处理器相对应的处理器相对应的try块开始和异常抛出块开始和异常抛出点之间创建、但尚未析构的所有自动对象进行析点之间创建、但尚未析构的所有自动对象进行析构,然后执行构,然后执行catch处理程序。处理程序。本讲稿第十九页,共二十九页多种异常的检测。多种异常的检测。
18、#includedoublejudgement(char*ptr,intag,doublesal);voidmain()charname20;doublesalary;intage;coutPleaseinputname:name;coutPleaseinputage:age;coutPleaseinputsalary:salary;if(judgement(name,age,salary)coutname=nameendl;coutage=ageendl;coutsalary=salaryendl;coutEndoftheprogram.endl;doublejudgement(char*p
19、tr,intag,doublesal)boollogic;logic=true;tryif(a16)throwag;if(s530)throwsal;catch(intag)logic=false;cout职工年龄小于职工年龄小于16岁,违反劳动法岁,违反劳动法!agendl;catch(doublesal)logic=false;cout工资低于本市最低工资工资低于本市最低工资530元,违反劳动元,违反劳动!salendl;returnlogic;本讲稿第二十页,共二十九页C+程程序序设设计计中中经经常常发发生生函函数数调调用用,在在调调用用函函数数时时除除需需要要了了解解函函数数参参数数值
20、值和和返返回回值值类类型型之之外外,当当函函数数有有异异常常抛抛出出时时,还还需需要要知知道道函函数数抛抛出出异异常常的的方方式式,以以方方便便调调用用函函数数(主主调调函函数数)对对异异常常进进行行处处理理.函函数数异异常常接接口的声明进一步提高了程序的可读性。口的声明进一步提高了程序的可读性。异异常常的的抛抛出出、捕捕获获与与处处理理已已经经成成为为函函数数接接口口的的一一部部分分,因此,在函数原型中需要指定函数可以抛出的异常类型。因此,在函数原型中需要指定函数可以抛出的异常类型。2.异常处理接口异常处理接口 本讲稿第二十一页,共二十九页1.指定异常类型指定异常类型类型类型函数名函数名(参
21、数表参数表)throw(A1,A2,An);函数原型声明表明可以抛出的异常类型为函数原型声明表明可以抛出的异常类型为A1,A2,An及这些类型的子类型异常。及这些类型的子类型异常。指定函数所抛出的异常的形式:指定函数所抛出的异常的形式:本讲稿第二十二页,共二十九页指定函数所抛出的异常的形式指定函数所抛出的异常的形式(续续)2.抛出任意类型异常抛出任意类型异常类型类型函数名函数名(参数表参数表);函数原型没有函数原型没有throw的说明,该函数可的说明,该函数可以抛出任意类型的异常。以抛出任意类型的异常。本讲稿第二十三页,共二十九页指定函数所抛出的异常的形式指定函数所抛出的异常的形式(续续)3.
22、不抛出异常不抛出异常类型类型函数名函数名(参数表参数表)throw();throw之后是一个空表,该函数原型声明表示该之后是一个空表,该函数原型声明表示该函数不抛出任何类型的异常。函数不抛出任何类型的异常。本讲稿第二十四页,共二十九页C+异常处理机制不仅能处理各种不同类异常处理机制不仅能处理各种不同类型的异常,而且能处理构造函数异常,即具型的异常,而且能处理构造函数异常,即具有为抛出异常前构造的所有局部对象自动调有为抛出异常前构造的所有局部对象自动调用析构函数的能力。用析构函数的能力。3.异常处理中的构造与析构异常处理中的构造与析构 本讲稿第二十五页,共二十九页#includevoidTest
23、Fun();classTestApublic:TestA()coutConstructingTestA.endl;TestA()coutDestructingTestAendl;voidDisplay()coutClassTestAException!endl;classTestBpublic:TestB();TestB();TestB:TestB()coutConstructingTestBendl;TestB:TestB()coutDestructingTestBendl;voidTestFun()TestBtb;coutThrowTestAException!endl;throwTest
24、A();voidmain()coutNowEntermain()endl;trycoutNowCallTestFun()endl;TestFun();catch(TestAta)coutAnTestAExceptionOccurred!endl;ta.Display();catch(.)coutOtherExceptionOccurred!endl;coutReturnmain()endl;本讲稿第二十六页,共二十九页C+标准库提供了包括exception类在内的9个标准异常类exception类是异常类的基类,该类的成员函数都包含一个没有指定异常列表的throw()。:10.4 C+标准异常
25、类标准异常类 本讲稿第二十七页,共二十九页exception框架代码框架代码class exceptionpublic:exception()throw();exception(const exception&rhs)throw();/复制构造函数复制构造函数 exception&operator=(const exception&rhs)throw();virtual exception()throw()virtual const char*what()const throw();异异常常类类exception中中含含有有成成员员函函数数what(),该该函函数数可可以以被被exceptio
26、n类类及及该该类类的的其其他他派派生生类类重重载载,用用于于返返回回一一个个描描述述异常的字符串常量。异常的字符串常量。本讲稿第二十八页,共二十九页练习练习练习练习试用试用试用试用trytry,catchcatch和和和和throwthrow语句实现求解实系数一元二语句实现求解实系数一元二语句实现求解实系数一元二语句实现求解实系数一元二次方程的实数根。次方程的实数根。次方程的实数根。次方程的实数根。1.系数自行输入系数自行输入系数自行输入系数自行输入2.a=02.a=0时抛出异常二次项系数异常,时抛出异常二次项系数异常,时抛出异常二次项系数异常,时抛出异常二次项系数异常,catchcatch语句块捕获语句块捕获语句块捕获语句块捕获异常并进行提示:该方程不是二次方程异常并进行提示:该方程不是二次方程异常并进行提示:该方程不是二次方程异常并进行提示:该方程不是二次方程3.3.当方程没有实数根式产生异常,有当方程没有实数根式产生异常,有当方程没有实数根式产生异常,有当方程没有实数根式产生异常,有throwthrow抛出无实抛出无实数根异常,数根异常,catchcatch语句块捕获异常并进行提示:该语句块捕获异常并进行提示:该方程没有实数根;方程没有实数根;本讲稿第二十九页,共二十九页