【精品】c c++语言程序设计(西电版第14章 异常处理(可编辑.ppt
-
资源ID:86272333
资源大小:611KB
全文页数:17页
- 资源格式: PPT
下载积分:15金币
快捷下载
会员登录下载
微信登录下载
三方登录下载:
微信扫一扫登录
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
|
【精品】c c++语言程序设计(西电版第14章 异常处理(可编辑.ppt
C C+语言程序设计(西电版)第14章 异常处理第十四章第十四章 异常异常处理理14.1 异常异常处理机制理机制14.2 异常异常处理的理的实现14.3 异常异常规范范14.4 小小结14.1异常异常处理机制理机制l lC+C+语语言异常言异常言异常言异常处处理机制的基本思想是将异常的理机制的基本思想是将异常的理机制的基本思想是将异常的理机制的基本思想是将异常的检检测测与与与与处处理分离。当在一个函数体中理分离。当在一个函数体中理分离。当在一个函数体中理分离。当在一个函数体中检测检测到异常条到异常条到异常条到异常条件存在,但却无法确定相件存在,但却无法确定相件存在,但却无法确定相件存在,但却无法确定相应应的的的的处处理方法理方法理方法理方法时时,该该函函函函数将引数将引数将引数将引发发一个异常,由函数的直接或一个异常,由函数的直接或一个异常,由函数的直接或一个异常,由函数的直接或间间接接接接调调用者用者用者用者捕捕捕捕获这获这个异常并个异常并个异常并个异常并处处理理理理这这个个个个错误错误。如果程序始。如果程序始。如果程序始。如果程序始终终没没没没有有有有处处理理理理这这个异常,最个异常,最个异常,最个异常,最终终它会被它会被它会被它会被传传到到到到C+C+运行系运行系运行系运行系统统那里,运行系那里,运行系那里,运行系那里,运行系统统捕捕捕捕获获异常后,通常只是异常后,通常只是异常后,通常只是异常后,通常只是简单简单地地地地终终止止止止这这个程序。个程序。个程序。个程序。l l由于异常由于异常由于异常由于异常处处理机制使得异常的引理机制使得异常的引理机制使得异常的引理机制使得异常的引发发和和和和处处理不必理不必理不必理不必在在在在同一函数中。同一函数中。同一函数中。同一函数中。这样这样,底,底,底,底层层的函数可以着重解决具的函数可以着重解决具的函数可以着重解决具的函数可以着重解决具体体体体问题问题而不必而不必而不必而不必过过多地考多地考多地考多地考虑对虑对异常的异常的异常的异常的处处理;上理;上理;上理;上层调层调用者可以在适当的位置用者可以在适当的位置用者可以在适当的位置用者可以在适当的位置设计对设计对不同不同不同不同类类型异常的型异常的型异常的型异常的处处理。理。理。理。14.2异常异常处理的理的实现l lC+的异常的异常处理机制通理机制通过throw、try和和catch三个三个语句来句来实现。一般情况下,被。一般情况下,被调用函数直接用函数直接检测到异常到异常处理条件的存理条件的存在,并使用在,并使用throw引引发一个异常;在上一个异常;在上层函数中,使用函数中,使用try监测函数确定是否引函数确定是否引发异常;异常;检测到的各种异常由到的各种异常由catch捕捕获并并作出相作出相应的的处理,从而使程序从理,从而使程序从这些异些异常事件中恢复常事件中恢复过来。来。14.2.1 异常异常处理的理的语法法l lthrow语法法l ltry语法法throw;try 复合复合语句句 在此在此在此在此处处,编译编译器在器在器在器在执执行代行代行代行代码码中中中中寻寻找一个能找一个能找一个能找一个能够处够处理抛理抛理抛理抛掷类掷类型型型型异常的异常的异常的异常的catchcatch处处理程序理程序理程序理程序(或一个能或一个能或一个能或一个能处处理任何理任何理任何理任何类类型异常的型异常的型异常的型异常的catchcatch处处理程序理程序理程序理程序)。catchcatch处处理程序按其在理程序按其在理程序按其在理程序按其在trytry块块后出后出后出后出现现的的的的顺顺序被序被序被序被检检查查。如果没有找到合适的。如果没有找到合适的。如果没有找到合适的。如果没有找到合适的处处理程序,理程序,理程序,理程序,则继续检查则继续检查下一个下一个下一个下一个动动态态封封封封闭闭的的的的trytry块查块查。此。此。此。此处处理理理理继续继续下去,直到最外下去,直到最外下去,直到最外下去,直到最外层层的封的封的封的封闭闭trytry块块被被被被检查检查完。完。完。完。l l如果匹配的如果匹配的如果匹配的如果匹配的处处理程序理程序理程序理程序未找到未找到未找到未找到,则则函数函数函数函数terminate()terminate()被自被自被自被自动调动调用,用,用,用,该该函数的默函数的默函数的默函数的默认认功能是功能是功能是功能是终终止程序。止程序。止程序。止程序。l l如果找到一个如果找到一个如果找到一个如果找到一个匹配的匹配的匹配的匹配的catchcatch处处理程序理程序理程序理程序,且它通,且它通,且它通,且它通过值进过值进行捕行捕行捕行捕获获,则则其形参通其形参通其形参通其形参通过过拷拷拷拷贝贝异常异常异常异常对对象象象象进进行初始化。如果它通行初始化。如果它通行初始化。如果它通行初始化。如果它通过过引用引用引用引用进进行捕行捕行捕行捕获获,则则参量被初始化参量被初始化参量被初始化参量被初始化为为指向异常指向异常指向异常指向异常对对象在形参被初始象在形参被初始象在形参被初始象在形参被初始化之后,化之后,化之后,化之后,“循循循循环环展开展开展开展开栈栈”的的的的过过程开始。程开始。程开始。程开始。l l例例例例14.1 14.1 处处理零异常。理零异常。理零异常。理零异常。l lcatch处理程序的理程序的出出现顺序序很重要,因很重要,因为在一个在一个try块中,异常中,异常处理程序是按照它出理程序是按照它出现的的顺序被序被检查的。只要找到一个匹配的的。只要找到一个匹配的异常异常类型,后面的异常型,后面的异常处理都将被忽略。理都将被忽略。例如,在下面的异常例如,在下面的异常处理理块中,首先出中,首先出现的是的是catch(),它可以捕,它可以捕获任何异常,在任何异常,在任何情况下,其他的任何情况下,其他的catch语句都不被句都不被检查。因此,。因此,catch()应该放在最后。放在最后。TryTry /catch()catch()/只在只在只在只在这这里里里里处处理所有的异常,理所有的异常,理所有的异常,理所有的异常,/后面的异常后面的异常后面的异常后面的异常处处理程序段不会被理程序段不会被理程序段不会被理程序段不会被检查检查 catch(const char*str)catch(const char*str)/catch(int)catch(int)/14.3 异常异常规范范l l异常异常规范范(Exception Specification)提供了一种方案:它能提供了一种方案:它能够随着函数声明列随着函数声明列出出该函数可能抛出的异常,它保函数可能抛出的异常,它保证该函数函数不会抛出任何其他不会抛出任何其他类型的异常。异常型的异常。异常规范范跟随在函数参数表之后,它由关跟随在函数参数表之后,它由关键字字throw 来指定,后面是用括号括起来的异来指定,后面是用括号括起来的异常常类型表。其型表。其语法格式法格式为:值类型型 函数名函数名(形参表形参表)throw(类型名表型名表)函数体函数体l l例如可以按如下方式例如可以按如下方式例如可以按如下方式例如可以按如下方式给给出出出出iStack iStack 类类的成的成的成的成员员函数函数函数函数的声明以增加适当的异常的声明以增加适当的异常的声明以增加适当的异常的声明以增加适当的异常规规范:范:范:范:class iStack class iStack public:public:/./.void pop(int&value)throw(popOnEmpty);void pop(int&value)throw(popOnEmpty);void push(int value)throw(pushOnFull);void push(int value)throw(pushOnFull);private:private:/./.;l l如果函数声明指定了一个异常如果函数声明指定了一个异常规范,范,则同同一函数的重复声明必一函数的重复声明必须指定同一指定同一类型的异型的异常常规范,同一函数的不同声明上的异常范,同一函数的不同声明上的异常规范是不能累范是不能累积的。例如的。例如l l/同一函数的两个声明同一函数的两个声明 extern int foo(int parm)throw(string);l l/错误:异常异常规范被省略范被省略 extern int foo(int parm)l l如果函数抛出了一个没有被列在异常如果函数抛出了一个没有被列在异常规范范中的异常会怎么中的异常会怎么样?程序只有在遇到某种?程序只有在遇到某种不正常情况不正常情况时异常才会被抛出。在异常才会被抛出。在编译时刻刻编译器不可能知道在器不可能知道在执行行时程序是否会程序是否会遇到遇到这些异常。因此一个函数的异常些异常。因此一个函数的异常规范范的的违例只能在例只能在运行运行时刻刻才能被才能被检测出来。出来。如果函数抛出了一个没有被列在其异常如果函数抛出了一个没有被列在其异常规范中的异常,范中的异常,则系系统调用用C+标准准库中定中定义的函数的函数unexpected()。l lunexpected()unexpected()的缺省行的缺省行的缺省行的缺省行为为是是是是调调用用用用terminate()terminate()。在。在。在。在某些条件下可能有必要改某些条件下可能有必要改某些条件下可能有必要改某些条件下可能有必要改变变unexpected()unexpected()执执行的行的行的行的动动作,作,作,作,C+C+标标准准准准库库提供了一种机制可提供了一种机制可提供了一种机制可提供了一种机制可让让我我我我们们改改改改变变unexpectedunexpected()()的缺省行的缺省行的缺省行的缺省行为为:(1 1)空的异常空的异常空的异常空的异常规规范范范范保保保保证证函数不会抛出任何异常,函数不会抛出任何异常,函数不会抛出任何异常,函数不会抛出任何异常,例如函数例如函数例如函数例如函数no_problem()no_problem()保保保保证证不会抛出任何异常。不会抛出任何异常。不会抛出任何异常。不会抛出任何异常。extern void no_problem()throw();extern void no_problem()throw();(2 2)如果一个函数声明)如果一个函数声明)如果一个函数声明)如果一个函数声明没有指定异常没有指定异常没有指定异常没有指定异常规规范范范范,则该则该函数可以抛出任何函数可以抛出任何函数可以抛出任何函数可以抛出任何类类型的异常。在被抛出的异常型的异常。在被抛出的异常型的异常。在被抛出的异常型的异常。在被抛出的异常类类型与异常型与异常型与异常型与异常规规范中指定的范中指定的范中指定的范中指定的类类型之型之型之型之间间不允不允不允不允许类许类型型型型转换转换。(3 3)也可以在函数指)也可以在函数指)也可以在函数指)也可以在函数指针针的的的的声明声明声明声明处处给给出一个异常出一个异常出一个异常出一个异常规规范,例如范,例如范,例如范,例如:void(*pf)(int)throw(string);void(*pf)(int)throw(string);该该声明表示声明表示声明表示声明表示pf pf 是一个函数指是一个函数指是一个函数指是一个函数指针针,它只能抛出,它只能抛出,它只能抛出,它只能抛出string string 类类型的异常。和函数声明一型的异常。和函数声明一型的异常。和函数声明一型的异常。和函数声明一样样,同一指,同一指,同一指,同一指针针的不同异常的不同异常的不同异常的不同异常规规范不能累范不能累范不能累范不能累积积。例例例例14.214.2使用使用使用使用带带析构析构析构析构语义语义的的的的类类的的的的C+C+异常异常异常异常处处理。理。理。理。14.4 小小结l l异常一般指的是程序运行期异常一般指的是程序运行期发生的非正常生的非正常情况。异常一般是不可情况。异常一般是不可预测的,如:内存的,如:内存不足、打开文件失不足、打开文件失败、范、范围溢出等。一个溢出等。一个优秀的秀的软件,不件,不仅要保要保证软件的正确性,件的正确性,而且而且还要保要保证软件具有一定的容件具有一定的容错能力。能力。