清华C语言程序设计第17章异常课件

上传人:痛*** 文档编号:241564223 上传时间:2024-07-04 格式:PPT 页数:33 大小:308KB
返回 下载 相关 举报
清华C语言程序设计第17章异常课件_第1页
第1页 / 共33页
清华C语言程序设计第17章异常课件_第2页
第2页 / 共33页
清华C语言程序设计第17章异常课件_第3页
第3页 / 共33页
点击查看更多>>
资源描述
第第1717章章 异常异常讲授内容讲授内容n异常处理的好处异常处理的好处n异常的抛出和传播异常的抛出和传播n异常的捕获和处理异常的捕获和处理17.1 17.1 异常处理的意义异常处理的意义(1/4)(1/4)n程序执行中需要处理异常程序执行中需要处理异常n动态分配空间时可能不会成功动态分配空间时可能不会成功n打开文件可能会失败打开文件可能会失败n除法运算时分母可能为除法运算时分母可能为0 0n整数相乘可能溢出整数相乘可能溢出n指针可能越界指针可能越界nn异常处理可以增加系统的鲁棒性异常处理可以增加系统的鲁棒性17.1 17.1 异常处理的意义异常处理的意义(2/4)(2/4)n异常处理方法一异常处理方法一n使用选择语句使用选择语句(ifelse)ifelse)n判断异常情况,即时处理判断异常情况,即时处理n正常程序流程和异常处理语句混在一起正常程序流程和异常处理语句混在一起n程序员往往无法专注于正常流程编程程序员往往无法专注于正常流程编程17.1 17.1 异常处理的意义异常处理的意义(3/4)(3/4)n异常处理方法二异常处理方法二n使用使用C+C+异常处理机制异常处理机制n判断异常情况,发现异常后抛出异常判断异常情况,发现异常后抛出异常n正常程序流程和异常处理模块分开正常程序流程和异常处理模块分开n程序员可以专注于正常流程编程,异常处理程序员可以专注于正常流程编程,异常处理模块稍候编写模块稍候编写17.1 17.1 异常处理的意义异常处理的意义(4/4)(4/4)nC+C+异常处理机制异常处理机制n程序在产生错误后抛出异常程序在产生错误后抛出异常n异常处理模块捕获并处理异常异常处理模块捕获并处理异常n异常处理机制一般无法使程序恢复正常执行异常处理机制一般无法使程序恢复正常执行n可以为程序提供有序的整理操作可以为程序提供有序的整理操作17.2 17.2 异常处理基础异常处理基础n关键字关键字trytry:出错时产生异常的代码放在出错时产生异常的代码放在trytry块中块中n关键字关键字throwthrow:throwthrow语句可以抛出任意语句可以抛出任意类型的异常,包括自定义类型类型的异常,包括自定义类型n关键字关键字catchcatch:catchcatch块(异常处理器)块(异常处理器)捕捉和处理异常捕捉和处理异常17.2 17.2 异常处理基础异常处理基础n一个异常处理器一般只捕捉一种类型的异常一个异常处理器一般只捕捉一种类型的异常ntrytry块抛出异常后,程序控制离开块抛出异常后,程序控制离开trytry块块n抛出异常后,程序在抛出异常后,程序在trytry块后面的块后面的catchcatch块中逐块中逐个搜索合适的异常处理器个搜索合适的异常处理器n如果如果trytry块没有异常抛出,则程序跳过所有块没有异常抛出,则程序跳过所有catchcatch块块n抛出异常之后,程序控制无法返回到抛出点抛出异常之后,程序控制无法返回到抛出点ntrytry块可以直接或间接抛出异常块可以直接或间接抛出异常例子例子1 1:除数为零的异常处理:除数为零的异常处理/ex17_1.cpp:除数为零的异常例子除数为零的异常例子#include#include/定义异常类定义异常类MyExceptionclassMyExceptionpublic:MyException(char*str)msg=str;char*show()returnmsg;private:char*msg;例子例子1 1:除数为零的异常处理:除数为零的异常处理/定义除法函数定义除法函数division,除数为除数为0时抛出异常。时抛出异常。doubledivision(intdividend,intdivisor)if(divisor=0)/抛出异常对象抛出异常对象throwMyException(error:dividedbyzero!);return(double)dividend/divisor;例子例子1 1:除数为零的异常处理:除数为零的异常处理main()inta,b;doubleresult;coutab)tryresult=division(a,b);couta/b=resultendl;catch(MyExceptione)coute.show()endl;coutendl;coutEntertwointegers(EOFtoend):;return0;程序运行结果程序运行结果Entertwointegers(EOFtoend):12712/7=1.71429Entertwointegers(EOFtoend):20error:dividedbyzero!Entertwointegers(EOFtoend):34534/5=6.8Entertwointegers(EOFtoend):17.3 17.3 异常的抛出和传播异常的抛出和传播n关键字关键字throwthrow可以带任何类型的操作数,包括可以带任何类型的操作数,包括自定义类型(异常对象)自定义类型(异常对象)n异常抛出后,最近的一个匹配的异常处理器捕异常抛出后,最近的一个匹配的异常处理器捕获该异常获该异常n如果没有匹配的异常处理器,则系统调用如果没有匹配的异常处理器,则系统调用terminateterminate函数,函数,terminateterminate函数省却地调用函数省却地调用abortabort函数终止程序的执行函数终止程序的执行n抛出异常时,抛出异常时,throwthrow语句生成异常对象的一个语句生成异常对象的一个副本,异常处理器执行完毕后删除该临时对象副本,异常处理器执行完毕后删除该临时对象 例子例子2 2:编写程序抛出各类异常,并捕捉它:编写程序抛出各类异常,并捕捉它们们(1/3)(1/3)/ex17_2.cpp:抛出多种类型异常的例子抛出多种类型异常的例子#includemain()inta,myint;floatmyfloat;doublemydouble;couta)/抛出不同类型的异常抛出不同类型的异常tryswitch(a%3)case0:/输入整数为输入整数为3的倍数时抛出整型异常的倍数时抛出整型异常myint=a;throwmyint;break;例子例子2 2:编写程序抛出各类异常,并捕捉它:编写程序抛出各类异常,并捕捉它们们(2/3)(2/3)case1:/抛出抛出float类型异常类型异常myfloat=(float)a;throwmyfloat;break;case2:/抛出抛出double类型异常类型异常mydouble=a;throwmydouble;break;default:break;例子例子2 2:编写程序抛出各类异常,并捕捉它:编写程序抛出各类异常,并捕捉它们们(3/3)(3/3)catch(inte)/捕获整型异常捕获整型异常coutIntegerException:eendl;catch(floate)/捕获浮点类型异常捕获浮点类型异常coutFloatException:eendl;catch(doublee)/捕获双精度类型异常捕获双精度类型异常coutDoubleException:eendl;coutendl;coutEnterainteger(EOFtoend):;return0;程序运行结果程序运行结果Enterainteger(EOFtoend):10FloatException:10Enterainteger(EOFtoend):11DoubleException:11Enterainteger(EOFtoend):12IntegerException:12Enterainteger(EOFtoend):13FloatException:13Enterainteger(EOFtoend):17.3 17.3 异常的抛出和传播异常的抛出和传播n异常只能在异常只能在trytry块中抛出,并由其后的符合类块中抛出,并由其后的符合类型的型的catchcatch块捕捉块捕捉n在在trytry块外面抛出的异常将不会被捕捉到,系块外面抛出的异常将不会被捕捉到,系统会调用统会调用terminateterminate函数终止程序的运行函数终止程序的运行n发生异常后跳出抛出异常的程序块,并且无法发生异常后跳出抛出异常的程序块,并且无法再返回到抛出点再返回到抛出点n异常可以在异常可以在trytry块中显式抛出,也可以在其调块中显式抛出,也可以在其调用的函数中抛出用的函数中抛出17.3 17.3 异常的抛出和传播异常的抛出和传播ntrytry块可以嵌套块可以嵌套n内层内层trytry块抛出异常的传播顺序块抛出异常的传播顺序n先在内层先在内层trytry块后面的块后面的catchcatch块中寻找合适的块中寻找合适的异常处理器异常处理器n找到则进行处理,异常不再往外传播找到则进行处理,异常不再往外传播n如果找不到,则将该异常向外传播,到外层如果找不到,则将该异常向外传播,到外层trytry块后面的块后面的catchcatch块中继续寻找块中继续寻找n如果异常传播到最外层的如果异常传播到最外层的trytry块仍然找不到,块仍然找不到,则程序调用则程序调用terminateterminate函数函数例子例子3 3:异常传播的例子:异常传播的例子/ex17_3.cpp:异常传播的例子。异常传播的例子。#includeintadd(inta,intb)/结果过大过小时都抛出异常结果过大过小时都抛出异常intres;tryres=a+b;if(res128)/抛出整型异常抛出整型异常throwres;if(res0)/抛出字符串异常抛出字符串异常throwNegativeresult!;catch(inte)/捕捉整型异常捕捉整型异常coutTheresultistoolarge:eendl;return-1;returnres;例子例子3 3:异常传播的例子:异常传播的例子main()inta,b,result;coutab)tryresult=add(a,b);if(result=0)coutTheresultisresultendl;catch(.)/捕捉传播到外层的所有异常捕捉传播到外层的所有异常coutUnexpectedexception.endl;coutendl;coutEnterainteger(EOFtoend):;return0;程序运行结果程序运行结果Entertwointegers(EOFtoend):1266Theresultis78Enterainteger(EOFtoend):23456Theresultistoolarge:479Enterainteger(EOFtoend):-12334Unexpectedexceptionfound.Enterainteger(EOFtoend):17.4 17.4 异常的捕获和处理异常的捕获和处理(1/4)(1/4)n异常处理器以关键字异常处理器以关键字catchcatch开始开始n异常处理器能带一个参数(能捕捉的异常类型)异常处理器能带一个参数(能捕捉的异常类型),参数名可选,参数名可选n有参数名时,可以在异常处理器内使用这个参有参数名时,可以在异常处理器内使用这个参数,该参数只是抛出的异常对象的一个副本数,该参数只是抛出的异常对象的一个副本 catch(int e)catch(int e)n没有参数名时,异常对象不从抛出点传递到异没有参数名时,异常对象不从抛出点传递到异常处理器中常处理器中 catch(int)catch(int)17.4 17.4 异常的捕获和处理异常的捕获和处理(2/4)(2/4)n程序按顺序寻找匹配的异常处理器,抛出的异程序按顺序寻找匹配的异常处理器,抛出的异常将第一个类型符合的异常处理器捕获常将第一个类型符合的异常处理器捕获n如果内层如果内层trytry块后面没有找到合适的异常处理块后面没有找到合适的异常处理器,该异常向外传播,到外层器,该异常向外传播,到外层trytry块后面寻找块后面寻找n没有被捕获的异常将调用没有被捕获的异常将调用terminateterminate函数,函数,terminateterminate函数默认调用函数默认调用abortabort终止程序的执行终止程序的执行n可以使用可以使用set_terminateset_terminate函数指定函数指定terminateterminate函函数将调用的函数数将调用的函数17.4 17.4 异常的捕获和处理异常的捕获和处理(3/4)(3/4)n参数列表中只有一个省略号的异常处理参数列表中只有一个省略号的异常处理器能捕捉所有类型的异常器能捕捉所有类型的异常 catch(.).catch(.).n要注意异常处理器的排列顺序,可能会要注意异常处理器的排列顺序,可能会影响异常处理的结果影响异常处理的结果17.4 17.4 异常的捕获和处理异常的捕获和处理(4/4)(4/4)n满足下面条件之一时,异常被捕捉满足下面条件之一时,异常被捕捉1.1.异常处理器的参数类型和抛出异常的类型完全相异常处理器的参数类型和抛出异常的类型完全相同同2.2.异常处理器的参数类型是抛出的异常对象的基类异常处理器的参数类型是抛出的异常对象的基类3.3.异常处理器的参数是基类的指针或引用,抛出异异常处理器的参数是基类的指针或引用,抛出异常的类型是派生类的指针或引用常的类型是派生类的指针或引用4.4.异常处理器的参数是异常处理器的参数是void*void*类型的指针,抛出异常类型的指针,抛出异常的类型是某一种类型的指针的类型是某一种类型的指针5.5.异常处理器为异常处理器为catch()catch()例子例子4 4:异常捕获的例子:异常捕获的例子/#include/定义基类定义基类classbasepublic:voidshow()coutBaseobject.endl;/定义派生类定义派生类classderived:publicbasepublic:voidshow()coutDerivedobject.endl;例子例子4 4:异常捕获的例子:异常捕获的例子/ex17_4.cpp:抛出基类和派生类异常抛出基类和派生类异常#includeex17_4.hmain()intno;coutno)tryif(no%2)=0)/抛出基类对象抛出基类对象throwbase();else/抛出派生类对象抛出派生类对象throwderived();例子例子4 4:异常捕获的例子:异常捕获的例子catch(baseb)coutException:;b.show();catch(derivedd)coutException:;d.show();coutendlInputaintegerplease:;return0;程序运行结果程序运行结果Inputaintegerplease:1Exception:Baseobject.Inputaintegerplease:2Exception:Baseobject.Inputaintegerplease:3Exception:Baseobject.Inputaintegerplease:4Exception:Baseobject.Inputaintegerplease:学习目的检测学习目的检测n理解异常处理的意义理解异常处理的意义n理解理解C+C+的异常处理机制的异常处理机制n掌握异常的传播机制掌握异常的传播机制n掌握异常的捕获规则掌握异常的捕获规则n掌握使用异常处理机制处理错误的方法掌握使用异常处理机制处理错误的方法n知道何时需要使用异常处理机制来处理知道何时需要使用异常处理机制来处理错误错误结束语当你尽了自己的最大努力时,失败也是伟大的,所以不要放弃,坚持就是正确的。When You Do Your Best,Failure Is Great,So DonT Give Up,Stick To The End感谢聆听不足之处请大家批评指导Please Criticize And Guide The Shortcomings演讲人:XXXXXX 时 间:XX年XX月XX日
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!