您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 能源与动力工程 > 21天学通C++-第二十章-异常处理
联系方式:北京源智天下科技有限公司第二十讲:异常处理杨章伟e-mail:jtclass@163.com1-2北京源智天下科技有限公司联系方式:课程内容安排•错误与异常•异常处理的实现•类和结构的异常处理•异常的处理机制•综合练习•思考和习题1-3北京源智天下科技有限公司联系方式:错误与异常•简单的说,异常就是程序在运行的过程中,由于使用环境的变化以及用户的操作而产生的错误。例如,内存不足时,应用程序请求分配内存;程序中出现了以零为除数的错误;打印机未打开,导致程序运行中挂接这些设备失败等等,都会引发异常。对这些错误,应用程序如果不能进行合适的处理,将会使程序变得非常脆弱,甚至不可使用。•异常处理对于编写健壮的软件来说无疑是非常重要,是否有完善的异常处理机制也会是评价某一个程序设计语言优劣的一个重要标准。1-4北京源智天下科技有限公司联系方式:异常处理的基本思想•简单的说,异常处理的基本思想就是捕获异常后进行处理。•如果程序最终没有相应的代码处理该异常,那么该异常最后被C++系统所接受,C++系统就简单地终止程序运行。异常的传递如图20-1所示。函数f()异常处理函数g()函数h()函数k()引发异常调用关系异常传递方向1-5北京源智天下科技有限公司联系方式:异常处理的实现•一般来说,在C++中对异常处理的实现分为两个步骤。•捕获异常•处理异常1-6北京源智天下科技有限公司联系方式:捕获异常•在C++中,提供了语句try/catch来捕获异常,其中,try和catch分别用于定义异常和定义异常处理。定义异常是将可能产生错误的语句放在try语句块中。其格式是:•try•{•可能产生错误的语句•}1-7北京源智天下科技有限公司联系方式:捕获异常并定义处理•例如,下列语句使用try/catch捕获异常,并定义捕获后对异常的处理。•try•{•stringstr=null;//定义字符串对象•ProcessString(str);//执行某个函数•}•catch(Exceptione)//定义对异常的处理•{•cout”Processiserror”;•exit(1);//异常退出程序•}1-8北京源智天下科技有限公司联系方式:抛出异常•抛出异常即检测是否产生异常,在C++中,其采用throw语句来实现,如果检测到产生异常,则抛出异常。该语句的格式为:•throw表达式;•如果在try语句块的程序段中(包括在其中调用的函数)发现了异常,且抛弃了该异常,则这个异常就可以被try语句块后的某个catch语句所捕获并处理,捕获和处理的条件是被抛弃的异常的类型与catch语句的异常类型相匹配。由于C++使用数据类型来区分不同的异常,因此在判断异常时,throw语句中的表达式的值就没有实际意义,而表达式的类型就特别重要。1-9北京源智天下科技有限公司联系方式:语句实现捕获和处理异常,该异常是除数为0的异常。实现功能如下所示。1-10北京源智天下科技有限公司联系方式:包含头文件2doubleDiv(double,double);//声明函数3voidmain()4{5try//定义异常6{7cout7.3/2.0=Div(7.3,2.0)endl;8cout7.3/0.0=Div(7.3,0.0)endl;//出现异常9cout7.3/1.0=Div(7.3,1.0)endl;10}11catch(double)//定义异常处理12{13coutexceptionofdevidingzero.\n;//输出错误信息14}15coutthatisok.\n;16}17doubleDiv(doublea,doubleb)//定义函数18{19if(b==0.0)20throwb;//抛出异常21returna/b;22}1-11北京源智天下科技有限公司联系方式:示例流程图执行语句:cout7.3/2.0=Div(7.3,2.0)endl;开始执行语句:cout7.3/0.0=Div(7.3,0.0)endl;执行语句:cout7.3/1.0=Div(7.3,1.0)endl;执行语句:cout攅xceptionofdevidingzero.\n;执行语句:cout攖hatisok.\n;结束1-12北京源智天下科技有限公司联系方式:异常处理的真正能力不仅在于它能处理各种不同类型的异常,还在于它具有在异常抛弃前为构造的所有局部对象自动调用析构函数的能力。当在程序中找到一个匹配的catch异常处理后,如果catch()语句的异常类型声明是一个值参数,则其初始化方式是复制被抛弃的异常对象;如果catch()语句的异常类型声明是一个引用,则其初始化方式是使该引用指向异常对象。1-13北京源智天下科技有限公司联系方式:中的异常处理机制是一种把控制权从异常发生的地点转移到一个匹配的处理函数或功能块的机制。其中,异常可以是内建数据类型变量,也可以是对象。一般来说,异常处理机制包括四个部分:try语句块:即一个定义异常的语句块。catch语句块:即一个或多个和try语句块相关的处理,其放在catch语句块中。throw表达式:即抛出异常语句。异常本身1-14北京源智天下科技有限公司联系方式:综合练习•下面给出一个处理文件时发生的异常实例。打开文件发生错误是经常发生的情况,那么C++是如何处理这种异常?其实现代码如下:1-15北京源智天下科技有限公司联系方式:包含文件打开头文件2#includeiostream.h//包含输入输出头文件3#includestdlib.h//包含库函数头文件4voidmain(intargc,char*argv)//带参数的main()函数5{6ifstreamsource(argv[1]);//打开文件7charline[128];//定义字符数组8try//定义异常9{10if(source.fail())//打开失败11throwargv[1];//抛出异常12}13catch(char*s)//定义异常处理14{15couterroropeningthefilesendl;//输出错误信息16exit(1);//异常退出17}18while(!source.eof())//文件未结束19{20source.getline(line,sizeof(line));//取出文件中内容21coutlineendl;//输出22}23source.close();//关闭对象24}1-16北京源智天下科技有限公司联系方式:思考和习题•当在try块中抛出异常后,程序最后是否回到try块中,继续执行后面的语句?•为什么要有异常重新抛出?异常重新抛出与处理的次序及过程是怎样的?•为什么C++要求资源的取得最好放在构造函数中,而资源的释放在析构函数中?•什么叫做栈展开(stackunwinding)?异常在其中按怎样的步骤寻求处理?•利用C++标准库的异常类结构,添加异常处理机构。栈满时的处理是把栈空间加倍,原栈内容拷入之后,再压栈。
本文标题:21天学通C++-第二十章-异常处理
链接地址:https://www.777doc.com/doc-6125636 .html