c++12

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第十二章异常处理清华大学郑莉C++语言程序设计C++语言程序设计清华大学郑莉2本章主要内容异常处理基础异常处理的基本思想C++异常处理的实现异常处理中的构造与析构C++语言程序设计清华大学郑莉程序中的错误通常包括三类:语法错误逻辑错误运行异常异常处理基础3C++语言程序设计清华大学郑莉语法错误:指程序中源代码的书写不符合编程语言的语法规范,通常是在程序中使用了错误的语法、函数、表达式、结构和类,致使程序无法生成运行代码。比如,关键字拼写错误、语句末尾缺少分号、括号不匹配、变量在使用前未定义等等。编译时,C++编译器能够发现程序中的语法错误并提示。异常处理基础4C++语言程序设计清华大学郑莉逻辑错误:又称语义错误,是指由于程序设计不当而造成程序不能完成预期的功能。例如,在对某组数据求取最大值时,数组的下标小于待求数据的个数,导致所求的值可能不是真正的最大值。这类错误在语法上并没有出错,程序可以正常通过编译,但是程序中的逻辑错误会安静地潜伏着,通常只有在程序员调试或测试程序时才能被发现。异常处理基础5C++语言程序设计清华大学郑莉运行异常:是指由程序运行环境问题造成的程序异常终止。例如,程序提出了内存分配申请,但内存空间分配不足;打印机未打开,导致程序运行中挂接设备失败;又比如当用户输入一个数字,程序将正常运行,但如果用户输入一个字母,程序将崩溃。程序中的运行异常也许可能经常出现,也可能所有时刻都不会出现。对运行异常错误,应用程序如果不能进行合适的处理,将会使程序变得非常脆弱,甚至不可使用。异常处理基础6C++语言程序设计清华大学郑莉【例12-1】编译一个程序,计算两个数的商,这两个数从控制台输入,如果出现被除数为零,则程序退出,并给出提示。#includeiostream#includecstdlibusingnamespacestd;doublefuc(doublex,doubley)//定义函数{if(y==0)//除数为0{cerrerrorofdividingzero.\n“;//输出错误信息exit(1);//异常退出程序}returnx/y;//返回两个数的商}异常处理基础7C++语言程序设计清华大学郑莉intmain(){doubleres;res=fuc(2,3);//调用函数coutTheresultof2/3is:resendl;//输出正确结果res=fuc(4,0);//除数为0发生异常coutTheresultof4/0is:resendl;//不执行该语句return0;}程序运行结果:Theresultof2/3is:0.666667errorofdividingzero.异常处理基础8C++语言程序设计清华大学郑莉处理异常的通常做法:在底层发生的问题,逐级上报,直到有能力可以处理异常的那级为止。在应用程序中,如果某个函数发现了错误并引发异常,这个函数就将该异常向上级调用者传递,请求调用者捕获该异常并处理该错误。如果调用者不能处理该错误,就继续向上级调用者传递,直到异常被捕获、错误被处理为止。异常处理的基本思想9C++语言程序设计清华大学郑莉10异常处理的基本思想函数f()捕获并处理异常函数h()引发异常函数g()……调用者异常传播方向调用关系C++语言程序设计清华大学郑莉11异常处理的实现机制抛掷异常的程序段......throw表达式;......捕获并处理异常的程序段try复合语句catch(异常类型声明)复合语句catch(异常类型声明)复合语句…C++语言程序设计清华大学郑莉C++异常处理三个关键字:throw、try和catch。使用异常处理的实现步骤:1.定义异常(try语句块)。将那些可能产生错误的语句框定在try块中。2.定义异常处理(catch语句块)。将异常处理的语句放在catch块中,以便异常处理被传递过来时就处理它。3.抛掷异常(throw语句)。检测是否产生异常,如果是,则抛掷异常。异常处理的实现机制12C++语言程序设计清华大学郑莉一般语法表达:try{//try块内监视异常if(条件)throwexception;//由throw抛出异常…;//其它语句}catch(类型1参数1){//catch块内处理代码}……catch(类型n参数n){//catch块内处理代码}异常处理的实现机制13C++语言程序设计清华大学郑莉14异常处理的实现机制若有异常则通过throw操作创建一个异常对象并抛掷。将可能抛出异常的程序段嵌在try块之中。控制通过正常的顺序执行到达try语句,然后执行try块内的保护段。如果在保护段执行期间没有引起异常,那么跟在try块后的catch子句就不执行。程序从try块后跟随的最后一个catch子句后面的语句继续执行下去。catch子句按其在try块后出现的顺序被检查。匹配的catch子句将捕获并处理异常(或继续抛掷异常)。如果匹配的处理器未找到,则运行函数terminate将被自动调用,其缺省功能是调用abort终止程序。C++语言程序设计清华大学郑莉15例12-2处理除零异常#includeiostream.hintDiv(intx,inty);intmain(){try{cout5/2=Div(5,2)endl;cout8/0=Div(8,0)endl;cout7/1=Div(7,1)endl;}catch(int){coutexceptofdevidingzero.\n;}coutthatisok.\n;}intDiv(intx,inty){if(y==0)throwy;returnx/y;}程序运行结果如下:5/2=2exceptofdevidingzero.thatisok.C++语言程序设计清华大学郑莉【例12-3】异常处理实现。#includeiostreamusingnamespacestd;constdoublePI=3.1416;voidfun(intx){try{if(x==0)throwx+8;//抛出int型的异常if(x==1)throw'B';//抛出char型的异常if(x==2)throwabook;//抛出字符串型的异常if(x==3)throwPI;//抛出double型的异常if(x==4)throwtrue;//抛出bool型的异常}catch(inti){coutcatchanintegeriendl;}catch(charc){coutcatchacharcendl;}异常处理的实现机制16C++语言程序设计清华大学郑莉catch(charstr[10]){coutcatchastringstrendl;}catch(doubled){coutcatchadoubledendl;cout异常处理完毕.\n“;}}intmain(){fun(0);fun(1);fun(2);fun(3);fun(4);return0;}程序运行结果:catchaninteger8catchacharBcatchastringabookcatchadouble3.1416异常处理完毕.异常处理的实现机制17C++语言程序设计清华大学郑莉异常处理规则(1)被检测的函数必须放在try块中,否则不起作用。(2)try块和catch块作为一个整体出现,catch块是try-catch结构中的一部分,必须紧跟在try块之后,不能单独使用,在二者之间也不能插入其他语句。但是在一个try-catch结构中,可以只有try块而无catch块。即在本函数中只检查而不处理,把catch处理块放在其他函数中。(3)try和catch块中必须有用花括号括起来的复合语句,即使花括号内只有一个语句,也不能省略花括号。(4)一个try-catch结构中只能有一个try块,但却可以有多个catch块,以便与不同的异常信息匹配。18C++语言程序设计清华大学郑莉异常处理规则(5)catch后面的圆括号中,一般只写异常信息的类型名,如catch(double)catch只检查所捕获异常信息的类型,而不检查它们的值。因此如果需要检测多个不同的异常信息,应当由throw抛出不同类型的异常信息。异常信息可以是C++系统预定义的标准类型,也可以是用户自定义的类型(如结构体或类)。如果由throw抛出的信息属于该类型或其子类型,则catch与throw二者匹配,catch捕获该异常信息。catch还可以有另外一种写法,即除了指定类型名外,还指定变量名,如catch(doubled)19C++语言程序设计清华大学郑莉异常处理规则此时如果throw抛出的异常信息是double型的变量a,则catch在捕获异常信息a的同时,还使d获得a的值,或者说d得到a的一个拷贝。什么时候需要这样做呢?有时希望在捕获异常信息时,还能利用throw抛出的值,如catch(doubled){cout″throw″d;}这时会输出d的值(也就是a值)。当抛出的是类对象时,有时希望在catch块中显示该对象中的某些信息。这时就需要在catch的参数中写出变量名(类对象名)。20C++语言程序设计清华大学郑莉(6)如果在catch子句中没有指定异常信息的类型,而用了删节号“…”,则表示它可以捕捉任何类型的异常信息,如catch(…){cout″OK″endl;}它能捕捉所有类型的异常信息,并输出″OK″。这种catch子句应放在try-catch结构中的最后,相当于“其他”。如果把它作为第一个catch子句,则后面的catch子句都不起作用。(7)try-catch结构可以与throw出现在同一个函数中,也可以不在同一函数中。当throw抛出异常信息后,首先在本函数中寻找与之匹配的catch,如果在本函数中无try-catch结构或找不到与之匹配的catch,就转到离出现异常最近的try-catch结构去处理。异常处理规则21C++语言程序设计清华大学郑莉(8)在某些情况下,在throw语句中可以不包括表达式,如throw;表示“我不处理这个异常,请上级处理”。此时它将把当前在处理的异常信息再次抛出,给其上一层的catch块处理,如catch(…){//其它语句throw;//将已捕获的异常信息再次原样抛出,由上一层的catch处理}(9)如果throw抛出的异常信息找不到与之匹配的catch块,那么系统就会调用一个系统函数terminate,使程序终止运行。异常处理规则22C++语言程序设计清华大学郑莉【例12-4】给出三角形的三边a,b,c,求三角形的面积。只有a+bc,b+ca,c+ab时才能构成三角形。设置异常处理,对不符合三角形条件的输出警告信息,不予计算。23异常处理程序的编写C++语言程序设计清华大学郑莉先写出没有异常处理时的程序:#includeiostream#includecmathusingnamespacestd;intmain(){doubletriangle(double,double,double);doublea,b,c;cinabc;while(a0&&b0&&c0){couttriangle(a,b,c)endl;cinabc;}return0;}24异常处理程序的编写C++语言程序设计清华大学郑莉doubletriangle(doublea,doubleb,doublec){doublearea;doubles=(a+b+c)/2;area=sqrt(s*(s-a)*(s-b)*(s-c));returnarea;}运行情况如下:654↙(输入a,b,c的值)9.92157(输出三角形的面积)11.52↙(输入a,b,c的值)0.726184(输出三角形的面积)121↙(输入a,b,c的值)0

1 / 47
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功