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