您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > C++ Programming Language11
西安电子科技大学计算机学院PHOENIX|课程讲义|January30,2020©2007XIDIAN.EDU.CNC++语言程序设计——异常处理SchoolofComputerScience&Engineering,XidianUniversityC++程序设计|©2007XIDIAN.EDU.CN2主要内容C++异常处理机制抛出异常Q&ASchoolofComputerScience&Engineering,XidianUniversityC++程序设计|©2007XIDIAN.EDU.CN3异常处理异常处理(ExceptionHandling)是一种错误状况的处理机制最初的C++并没有异常处理机制,随着语言的发展,在C++标准化时,将这项功能加入到标准之中在一般简单的程序中不常用到异常处理机制,但在团队合作的专业开发中,可以通过该机制来处理各个程序模块彼此关联时可能遇到的问题,从而提高程序的可靠性SchoolofComputerScience&Engineering,XidianUniversityC++程序设计|©2007XIDIAN.EDU.CN4什么是异常?每个程序在执行的时候,都可能遇到一些意外的情况,例如:–用户的不合理的输入数据–找不到要打开的文件–数组下标越界错误–除零错误–内存空间不足,无法分配–……SchoolofComputerScience&Engineering,XidianUniversityC++程序设计|©2007XIDIAN.EDU.CN5什么是异常?一般情况下,程序运行遇到这些错误时,不是执行结果异常,就是系统会立即中止程序,而这两种结果都不是最合理处理方式因此,为了提高程序的可靠性,在设计程序时就需要预先设计遭遇意外情况时的处理措施,使得程序不会出现奇怪的运行结果或随意地中止运行过去常见的方式是用if语句先检查变量或者用户输入,若有不合理数据则做适当的处理,例如:int*intPtr=(int*)malloc(sizeof(int)*100);if(intPtr==NULL){//……}SchoolofComputerScience&Engineering,XidianUniversityC++程序设计|©2007XIDIAN.EDU.CN6什么是异常?这种处理方式下,如果程序规模很大时,就会发现正常的程序代码与处理意外情况的程序代码混杂在一起,并导致程序流程复杂,造成程序维护困难为改善这种情况,C++提供一种异常处理机制,让程序设计人员可以用更有效率的方式来处理各种异常或错误情况对C++而言,当异常(Exception)发生时,程序(或程序所调用的函数)会抛出(throw)异常,此时若不加以处理,程序就会异常中止.我们先来看程序产生异常时,异常中止的情形,下面程序会产生索引越界异常SchoolofComputerScience&Engineering,XidianUniversityC++程序设计|©2007XIDIAN.EDU.CN7异常产生程序中止#includeiostream#includestringusingnamespacestd;intmain(){intindex,len;stringstr(“earthquake);coutEnterthebeginindexofsubstring:endl;cinindex;coutEnterthelengthofsubstring:endl;cinlen;coutstr.substr(index,len)=str.substr(index,len)endl;coutYoucan'tseethissentenceifexceptionoccured.endl;return0;}SchoolofComputerScience&Engineering,XidianUniversityC++程序设计|©2007XIDIAN.EDU.CN8什么是异常?在调用string类的成员函数substr()时,如果参数索引值越界,则会引发异常.由于我们的程序代码未对这种可能的情况做任何处理,所以此时将会粗暴中止程序运行.可以想象,如果我们开发的是商业软件,出现类似的无信息粗暴中止,会极大降低用户满意度SchoolofComputerScience&Engineering,XidianUniversityC++程序设计|©2007XIDIAN.EDU.CN9解决方法—条件测试方式可以在程序中通过条件测试的方式来对意外情况做一定的处理,比如本例中,可通过如下代码处理:……coutEnterthebeginindexofsubstring:endl;cinindex;coutEnterthelengthofsubstring:endl;cinlen;while(index=str.size()||len(str.size()-index)){coutdataoutofrange,pleaseenteragain:endl;coutEnterthebeginindexofsubstring:endl;cinindex;coutEnterthelengthofsubstring:endl;cinlen;}……SchoolofComputerScience&Engineering,XidianUniversityC++程序设计|©2007XIDIAN.EDU.CN10解决方法—异常处理方式……try{coutEnterthebeginindexofsubstring:endl;cinindex;coutEnterthelengthofsubstring:endl;cinlen;coutstr.substr(index,len)=str.substr(index,len)endl;}catch(out_of_range&e){cerrError:e.what()endl;}coutYoucanseethissentenceevenifexceptionoccured.endl;……SchoolofComputerScience&Engineering,XidianUniversityC++程序设计|©2007XIDIAN.EDU.CN11异常处理基本结构在C++异常处理机制下,当程序运行时遇到无法解决的情况,系统会产生对应的异常对象以通知程序该意外情况.对程序而言,应该以异常处理架构来捕捉和处理异常.C++语言用关键字try和catch来建立异常处理架构,其语法如下:try{//可能引发异常的语句//例如索引越界}catch(异常的类型异常对象){//处理异常的语句}SchoolofComputerScience&Engineering,XidianUniversityC++程序设计|©2007XIDIAN.EDU.CN12异常处理基本结构在try区块中可以放入正常的程序代码,也就是程序正常执行的语句.通常将一段可能会引发异常的语句(比如前述的取子串的语句)放在try区块中注意:即使try区块内的语句只有一行,也不能省略大括号,这是try复合语句与if/for等复合语句的区别catch区块中即所谓的异常处理程序,也就是要用来处理不正常状况的程序代码.在catch后面的括号类似于函数的参数声明,在此处列出此段程序是要捕捉哪一类型的异常,当发生此类型异常时,执行该catch区块内的程序代码SchoolofComputerScience&Engineering,XidianUniversityC++程序设计|©2007XIDIAN.EDU.CN13异常处理程序执行流程程序结束程序被中止进入try区块有否发生异常[有][没有]后续的程序对应的catch区块是否存在捕捉该类型异常的catch区块[有][没有]SchoolofComputerScience&Engineering,XidianUniversityC++程序设计|©2007XIDIAN.EDU.CN14异常处理的基本结构stdexcept内包含多个C++标准库的异常类定义try区块中包含调用string类成员函数substr()的语句,如果参数不合理,会引发异常catch后的括号内声明捕捉的是out_of_range类型的异常对象,复合语句用cerr输出相关信息捕捉到的异常对象(e)调用其成员函数what(),返回有关该异常对象的简单信息通过try与catch机制,当异常产生时,程序不会中止执行,而是跳转到相应catch区块继续执行.执行完catch内代码后,继续执行之后代码,使得程序可以正常执行完毕SchoolofComputerScience&Engineering,XidianUniversityC++程序设计|©2007XIDIAN.EDU.CN15未捕捉到合适的异常注意,欲使异常处理机制能在异常产生时发挥效用,catch捕捉的意外类型必须与程序抛出的意外类型一致.否则即使程序中有try/catch区块,发生未捕捉到的异常类型时,程序仍然会立即中止执行虽然有捕捉out_of_range类型异常的catch区块,但当类型不匹配的异常被抛出时,系统仍会因为找不到相应的catch区块而中止程序运行SchoolofComputerScience&Engineering,XidianUniversityC++程序设计|©2007XIDIAN.EDU.CN16捕捉多个异常如果希望程序可以捕捉多个异常,可以在try区块后加上多个catch区块,每个区块都负责处理某一种异常发生的情形,其结构如下:try{//可能引发异常的语句//例如索引越界}catch(异常类型1异常对象){//处理异常的语句}catch(异常类型2异常对象){//处理异常的语句}//还可以继续再接其它的catch区块SchoolofComputerScience&Engineering,XidianUniversityC++程序设计|©2007XIDIAN.EDU.CN17捕捉多个异常当try区块中的语句引发异常时,系统会依次序根据异常类型是否相符来寻找合式的catch区块若发现相符者,就将程序流程转到该catch区块执行,找到某相符catch区块后并执行完毕后,程序控制跳转到所有catch区块之后的语句,其它catch区块将不会被执行若找完最后一个catch区块还未找到,则中止程序执行SchoolofComputerScience&Engineering,XidianUniversityC++程序设计|©2007XIDIAN.EDU.CN18捕捉所有异常当程序规模越来越大,复杂性不断提高,try区块中的语句有可能引发各种各样的异常因为通常我们不想对每一种异常都做特定的处理,所以为每一种异常类型写一个catch区块是不必要的但即使不想处理所有的异常,也不希望程序在发生为处理的异常时,突然的中止执行可以用一个特别的catch区块来捕捉所有不想特别处理的异常SchoolofComputerScience&Engineering,XidianUniversityC++程序设计|©2007XIDIAN.EDU.CN19捕捉所有异常捕捉所有异常catch区块语法:try{//可能引发异常的语句}catch(…){//可捕捉所有异常的catch区块//处理异常的语句}catch(…)的语法也可与其他catch区块同时使用,可以处理其它catch区块都未能匹配的异常catch(…)与其它catch区块同时使用顺序问题SchoolofComputerScience&Engineering,XidianUniversityC++程序设计|©2007XIDIAN.
本文标题:C++ Programming Language11
链接地址:https://www.777doc.com/doc-3391267 .html