《面向对象程序设计第十二章异常处理机制优秀课件.ppt》由会员分享,可在线阅读,更多相关《面向对象程序设计第十二章异常处理机制优秀课件.ppt(29页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、面向对象程序设计第十二章异常处理机制第1页,本讲稿共29页 本章主要内容:本章主要内容:异常处理的任务与思想异常处理的任务与思想异常处理的实现异常处理的实现异常处理的应用异常处理的应用异常处理中的构造与析构异常处理中的构造与析构C+标准异常类标准异常类第2页,本讲稿共29页10.1 异常处理的任务与思想异常处理的任务与思想 软软件件不不仅仅要要保保证证能能正正确确完完成成任任务务,还还应应当当具具有有良良好好的的容错性容错性。容容错错性性是是指指软软件件不不仅仅在在正正确确操操作作的的条条件件下下能能正正确确运运行行,而而且且当当环环境境异异常常或或不不当当使使用用时时,依依然然能能合合理理处
2、处理理运运行行过过程程中中的的出出现现的的各各种种异异常常,而而不不会产生各种意想不到的后果。会产生各种意想不到的后果。程序中的各种异常通过分析完全可以预料程序中的各种异常通过分析完全可以预料。根根据据异异常常的的不不同同情情况况进进行行对对异异常常进进行行处处理理,如如给给出出提提示示信信息息、允允许许用用户户排排除除环环境境错错误误、继继续续运运行程序等都是异常处理的基本任务。行程序等都是异常处理的基本任务。第3页,本讲稿共29页1.传统的异常处理方法传统的异常处理方法 传统程序设计方法中,通常采用系统提供的中断函数或传统程序设计方法中,通常采用系统提供的中断函数或指令。指令。当被调用函数
3、发生异常或产生错误时,返回一个特当被调用函数发生异常或产生错误时,返回一个特定的值,以便调用函数检测错误标志,并作出处理;定的值,以便调用函数检测错误标志,并作出处理;或当错误产生时,释放所有资源,结束程序运行或当错误产生时,释放所有资源,结束程序运行第4页,本讲稿共29页常用中断函数或指令常用中断函数或指令 函数原型函数原型/指令指令 功功能能 头文件头文件void abort()中断程序执行,返回主中断程序执行,返回主C+窗口窗口 stdlib.hvoid assert(表达表达式式)若表达式的值为若表达式的值为false则中断程序执行,则中断程序执行,并显示中断所在的文件和所在行号并显示
4、中断所在的文件和所在行号 assert.hvoid exit(状态状态)中断程序执行,返回退出代码(状态中断程序执行,返回退出代码(状态值)值)stdlib.hreturn 表达式表达式终止函数执行终止函数执行,返回表达式的值返回表达式的值第5页,本讲稿共29页l#includeldoublediv(double,double);lvoidmain()lldoublex,y;lcouty;lcoutx;lif(x=0)lcoutDividedbyzero,Error!endl;lelsellcoutq=div(x,y)endl;llcoutEndoftheprogram.endl;lldoub
5、lediv(doublex,doubley)llreturny/x;l传统异常处理方法的优点是异常传统异常处理方法的优点是异常处理直接,系统运行开销少,适处理直接,系统运行开销少,适用于处理简单的局部错误与异常。用于处理简单的局部错误与异常。不足之处是异常处理代码分布于程序不足之处是异常处理代码分布于程序中可能出错的各个地方,异常处理代中可能出错的各个地方,异常处理代码与系统功能实现代码混在一起,降码与系统功能实现代码混在一起,降低程序的可读性与可维护性,不适合低程序的可读性与可维护性,不适合大型软件的开发,也不符合现代软件大型软件的开发,也不符合现代软件工程的理念工程的理念第6页,本讲稿共2
6、9页2.C+异常处理机制异常处理机制在在大大型型软软件件中中,由由于于函函数数之之间间具具有有各各自自明明确确的的分分工工并并可可能能存存在在调调用用关关系系,发发生生错错误误的的函函数数可可能能不不便便于于或或不不具具备备处处理理错错误误的条件。的条件。C+异异常常处处理理机机制制的的基基本本思思想想是是将将异异常常检检测测与与异异常常处处理理分分离离。产产生生异异常常的的函函数数不不一一定定需需要要具具备备异异常常处处理理的的能能力力,当当一一个个函函数数发发生生异异常常时时,它它抛抛出出所所发发生生的的异异常常或或错错误误,由由调调用用者者捕捕获获或或处处理理异异常常,若若上上层层调调用
7、用函函数数仍仍不不便便于于处处理理异异常常,还还可可以以进进一一步步抛抛出出异异常常,按按调调用用层层次次关关系系传传递递给更上一层处理。给更上一层处理。第7页,本讲稿共29页2.C+异常处理机制异常处理机制函数函数f()f()捕获并处理异常捕获并处理异常函数函数h()h()引发异常引发异常函数函数g()g()调用者调用者异常传播方向异常传播方向调用关系调用关系第8页,本讲稿共29页10.2 C+异常处理的实现异常处理的实现 C+语言提供了对异常处理机制的内部支持语言提供了对异常处理机制的内部支持由由try、throw和和catch语句提供了语句提供了C+用于实用于实现异常处理的机制。现异常处
8、理的机制。在异常处理机制的支持下,可以更合理、更在异常处理机制的支持下,可以更合理、更有效的处理程序运行过程中存在的各种异常现有效的处理程序运行过程中存在的各种异常现象。象。第9页,本讲稿共29页1.异常处理的语法异常处理的语法try-throw-catch是是C+异常处理机制的实现语句;异常处理机制的实现语句;程序中可能产生异常的部分应包含于程序中可能产生异常的部分应包含于try块之中;块之中;异常由紧随其后的异常由紧随其后的catch语句捕获和处理;语句捕获和处理;throw语句的作用是抛出异常。语句的作用是抛出异常。第10页,本讲稿共29页异常处理程序的使用形式异常处理程序的使用形式tr
9、y语句;语句;catch(类型类型1参数参数1)与类型与类型1相关的异常处理语句;相关的异常处理语句;catch(类型类型2参数参数2)与类型与类型2相关的异常处理语句;相关的异常处理语句;catch(类型类型n参数参数n)与类型与类型n相关的异常处理语句;相关的异常处理语句;throw表达式使用格式如下:表达式使用格式如下:throw 表达式;表达式;第11页,本讲稿共29页 try try语句块实际上是程序代码的保护段,表明该程序语句块实际上是程序代码的保护段,表明该程序段在执行过程中可能会产生异常或出现错误;段在执行过程中可能会产生异常或出现错误;若预料某段程序代码或某个函数可能发生异常
10、或错误,若预料某段程序代码或某个函数可能发生异常或错误,就应当将之置于就应当将之置于trytry语句块之内;语句块之内;一旦该代码段或函数在调用过程中产生了异常情况,一旦该代码段或函数在调用过程中产生了异常情况,throwthrow语句将抛出这个异常,并通过语句将抛出这个异常,并通过throwthrow之后的表达式返回之后的表达式返回一个值;一个值;有关说明有关说明第12页,本讲稿共29页当函数出现了自己不能处理的异常,就可以使用当函数出现了自己不能处理的异常,就可以使用“throw throw 表达式表达式”将异常抛出;将异常抛出;throwthrow之后的之后的“表达式表达式”表示异常类型
11、,它在语法上与表示异常类型,它在语法上与returnreturn语句的语句的“表达式表达式”值类似;值类似;throwthrow语句表达式的值不能用来区分不同异常,所以语句表达式的值不能用来区分不同异常,所以当程序将要抛出多个异常,应该用不同类型的表达式值当程序将要抛出多个异常,应该用不同类型的表达式值相互区别;相互区别;有关说明有关说明(续续)第13页,本讲稿共29页catchcatch语句块是异常处理的程序代码,捕获和处理由语句块是异常处理的程序代码,捕获和处理由“throw表达式表达式”所抛出的异常。所抛出的异常。catch catch 之后的异常类型可以是任何有效的数据类型,它之后的异
12、常类型可以是任何有效的数据类型,它与函数的形参类似,既可以是与函数的形参类似,既可以是 intint、floatfloat等某个类型值,等某个类型值,也可以是引用及也可以是引用及C+C+的类,它用于指定的类,它用于指定catchcatch语句块所处理的语句块所处理的异常的类型;异常的类型;当异常被抛出后,当异常被抛出后,catchcatch块依次被检查块依次被检查 ,若某,若某catchcatch语语句块的异常类型与被抛出的异常类型一致,则执行该异常句块的异常类型与被抛出的异常类型一致,则执行该异常处理程序段。处理程序段。有关说明有关说明(续续)第14页,本讲稿共29页在一个在一个trytry
13、语句块内,异常处理程序将按照它出现的语句块内,异常处理程序将按照它出现的位置先后顺序进行检查。若找到一个匹配的异常类型,位置先后顺序进行检查。若找到一个匹配的异常类型,后面的异常处理都将被忽略;后面的异常处理都将被忽略;如果异常类型声明是一个省略号如果异常类型声明是一个省略号()(),则表示,则表示catchcatch语句可以处理任何类型的异常;语句可以处理任何类型的异常;类型为省略号的类型为省略号的catchcatch处理程序必须是处理程序必须是trytry块的最后一块的最后一段处理程序。段处理程序。有关说明有关说明(续续)第15页,本讲稿共29页double div(double x,do
14、uble 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;第16页,本讲稿共29页异常处理的执行过程异常处理的执行过程 通过正常的执行顺序直到通过正常的执行顺序直到try语句,然后执语句,然后
15、执行行try块内的保护段。块内的保护段。若保护段在执行期间没有产生异常,则若保护段在执行期间没有产生异常,则try语句块后的语句块后的catch块不会被执行,程序从最后块不会被执行,程序从最后一个一个catch语句块后面的语句继续执行。语句块后面的语句继续执行。第17页,本讲稿共29页异常处理的执行过程异常处理的执行过程(续续)若保护段在执行期间或保护段调用的任何若保护段在执行期间或保护段调用的任何函数中函数中(直接或间接的调用直接或间接的调用)有异常抛出,则从有异常抛出,则从通过通过throw操作数创建的对象中创建一个异常操作数创建的对象中创建一个异常对象。然后寻找对象。然后寻找catch语
16、句块或一个能处理任语句块或一个能处理任何类型异常的何类型异常的catch处理块。处理块。catch语句块按其语句块按其出现的顺序被检查,出现的顺序被检查,如果没有匹配的如果没有匹配的catch处处理块,则继续检查下一个动态封闭的理块,则继续检查下一个动态封闭的try块,块,直到最外层的封闭直到最外层的封闭try块被检查完。块被检查完。第18页,本讲稿共29页异常处理的执行过程异常处理的执行过程(续)若没有匹配的若没有匹配的catch处理块,则处理块,则terminate函函数将被自动调用,而数将被自动调用,而terminate函数的默认功能函数的默认功能是调用是调用abort函数终止程序。函数
17、终止程序。若有匹配的若有匹配的catch处理块,如果它通过值进处理块,如果它通过值进行捕获,则其形参通过复制异常对象进行初始行捕获,则其形参通过复制异常对象进行初始化。如果它通过引用进行捕获,则参量被初始化。如果它通过引用进行捕获,则参量被初始化为指向异常对象。在形参被初始化之后,对化为指向异常对象。在形参被初始化之后,对那些在与那些在与catch处理器相对应的处理器相对应的try块开始和异块开始和异常抛出点之间创建、但尚未析构的所有自动对常抛出点之间创建、但尚未析构的所有自动对象进行析构,然后执行象进行析构,然后执行catch处理程序。处理程序。第19页,本讲稿共29页多种异常的检测。多种异
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(c
19、har*ptr,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;第20页,本讲稿共29页C+程程序序设设计计中中经经常常发发生生函函数数调调用用,在在调调用用函函数数时时除除需需要要了了解解函函数数参
20、参数数值值和和返返回回值值类类型型之之外外,当当函函数数有有异异常常抛抛出出时时,还还需需要要知知道道函函数数抛抛出出异异常常的的方方式式,以以方方便便调调用用函函数数(主主调调函函数数)对对异异常常进进行行处处理理.函函数数异异常常接接口的声明进一步提高了程序的可读性。口的声明进一步提高了程序的可读性。异异常常的的抛抛出出、捕捕获获与与处处理理已已经经成成为为函函数数接接口口的的一一部部分分,因因此此,在在函函数数原原型型中中需需要要指指定定函函数数可可以以抛抛出出的的异异常常类型。类型。2.异常处理接口异常处理接口 第21页,本讲稿共29页1.指定异常类型指定异常类型类型类型函数名函数名(
21、参数表参数表)throw(A1,A2,An);函数原型声明表明可以抛出的异常类型函数原型声明表明可以抛出的异常类型为为A1,A2,An及这些类型的子类型异常。及这些类型的子类型异常。指定函数所抛出的异常的形式:指定函数所抛出的异常的形式:第22页,本讲稿共29页指定函数所抛出的异常的形式指定函数所抛出的异常的形式指定函数所抛出的异常的形式指定函数所抛出的异常的形式(续续)2.抛出任意类型异常抛出任意类型异常类型类型函数名函数名(参数表参数表);函数原型没有函数原型没有throw的说明,该函数可的说明,该函数可以抛出任意类型的异常。以抛出任意类型的异常。第23页,本讲稿共29页指定函数所抛出的异
22、常的形式指定函数所抛出的异常的形式(续续)3.不抛出异常不抛出异常类型类型函数名函数名(参数表参数表)throw();throw之后是一个空表,该函数原型声明表示之后是一个空表,该函数原型声明表示该函数不抛出任何类型的异常。该函数不抛出任何类型的异常。第24页,本讲稿共29页 C+异常处理机制不仅能处理各种不同异常处理机制不仅能处理各种不同类型的异常,而且能处理构造函数异常,即类型的异常,而且能处理构造函数异常,即具有为抛出异常前构造的所有局部对象自动具有为抛出异常前构造的所有局部对象自动调用析构函数的能力。调用析构函数的能力。3.异常处理中的构造与析构异常处理中的构造与析构 第25页,本讲稿
23、共29页#include void TestFun();class TestA public:TestA()coutConstructing TestA.endl;TestA()coutDestructing TestAendl;void Display()coutClass TestA Exception!endl;class TestBpublic:TestB();TestB();TestB:TestB()coutConstructing TestBendl;TestB:TestB()coutDestructing TestBendl;void TestFun()TestB tb;cout
24、Throw TestA Exception!endl;throw TestA();void main()coutNow Enter main()endl;try coutNow Call TestFun()endl;TestFun();catch(TestA ta)coutAn TestA Exception Occurred!endl;ta.Display();catch(.)coutOther Exception Occurred!endl;coutReturn main()endl;第26页,本讲稿共29页C+标准库提供了包括exception类在内的9个标准异常类exception类是
25、异常类的基类,该类的成员函数都包含一个没有指定异常列表的throw()。:10.4 C+标准异常类标准异常类 第27页,本讲稿共29页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();异异常常类类exce
26、ption中中含含有有成成员员函函数数what(),该该函函数数可可以以被被exception类类及及该该类类的的其其他他派派生生类类重重载载,用用于于返返回回一一个个描描述述异常的字符串常量。异常的字符串常量。第28页,本讲稿共29页练习练习练习练习试用试用试用试用trytry,catchcatch和和和和throwthrow语句实现求解实系数一元二语句实现求解实系数一元二语句实现求解实系数一元二语句实现求解实系数一元二次方程的实数根。次方程的实数根。次方程的实数根。次方程的实数根。1.1.系数自行输入系数自行输入系数自行输入系数自行输入2.a=02.a=0时抛出异常二次项系数异常,时抛出异
27、常二次项系数异常,时抛出异常二次项系数异常,时抛出异常二次项系数异常,catchcatch语句块捕语句块捕语句块捕语句块捕获异常并进行提示:该方程不是二次方程获异常并进行提示:该方程不是二次方程获异常并进行提示:该方程不是二次方程获异常并进行提示:该方程不是二次方程3.3.当方程没有实数根式产生异常,有当方程没有实数根式产生异常,有当方程没有实数根式产生异常,有当方程没有实数根式产生异常,有throwthrow抛出无实数根抛出无实数根抛出无实数根抛出无实数根异常,异常,异常,异常,catchcatch语句块捕获异常并进行提示:该方程没有语句块捕获异常并进行提示:该方程没有语句块捕获异常并进行提示:该方程没有语句块捕获异常并进行提示:该方程没有实数根;实数根;实数根;实数根;第29页,本讲稿共29页