- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
教学课件讲义PPT教学教案培训资料医学中小学上课资料
第十四章 异常处理
C/C++语言程序设计
龚尚福,贾澎涛主编
《C/C++语言程序设计》
西安电子科技大学出版社
第十四章 异常处理
14.1 异常处理机制
14.2 异常处理的实现
14.3 异常规范
14.4 小结
14.1异常处理机制
C++语言异常处理机制的基本思想是将异常的检测与处理分离。当在一个函数体中检测到异常条件存在,但却无法确定相应的处理方法时,该函数将引发一个异常,由函数的直接或间接调用者捕获这个异常并处理这个错误。如果程序始终没有处理这个异常,最终它会被传到C++运行系统那里,运行系统捕获异常后,通常只是简单地终止这个程序。
由于异常处理机制使得异常的引发和处理不必在同一函数中。这样,底层的函数可以着重解决具体问题而不必过多地考虑对异常的处理;上层调用者可以在适当的位置设计对不同类型异常的处理。
14.2异常处理的实现
C++的异常处理机制通过throw、try和catch三个语句来实现。一般情况下,被调用函数直接检测到异常处理条件的存在,并使用throw引发一个异常;在上层函数中,使用try监测函数确定是否引发异常;检测到的各种异常由catch捕获并作出相应的处理,从而使程序从这些异常事件中恢复过来。
14.2.1 异常处理的语法
throw语法
try语法
throw 表达式;
try
{
复合语句
}
3.catch语法
catch(异常类型1 参数1)
{
复合语句1 //针对异常类型1的处理语句
}
catch(异常类型2 参数2)
{
复合语句2 //针对异常类型2的处理语句
}
…
catch(异常类型n 参数n)
{
复合语句n //针对异常类型n的处理语句
}
14.2.2 异常处理的执行过程
通过正常的顺序执行到达try语句,然后执行try块内的保护段。
如果在保护段执行期间没有引起异常,那么跟在try块后的catch子句不执行。程序从try块后面跟随的最后一个catch语句之后的语句继续执行下去。
如果在保护段执行期间或在保护段调用的任何函数中(直接或间接的调用)有异常被抛出,则通过throw创建一个异常对象(这隐含指可能包含一个拷贝构造函数)。
在此处,编译器在执行代码中寻找一个能够处理抛掷类型异常的catch处理程序(或一个能处理任何类型异常的catch处理程序)。catch处理程序按其在try块后出现的顺序被检查。如果没有找到合适的处理程序,则继续检查下一个动态封闭的try块查。此处理继续下去,直到最外层的封闭try块被检查完。
如果匹配的处理程序未找到,则函数terminate()被自动调用,该函数的默认功能是终止程序。
如果找到一个匹配的catch处理程序,且它通过值进行捕获,则其形参通过拷贝异常对象进行初始化。如果它通过引用进行捕获,则参量被初始化为指向异常对象在形参被初始化之后,“循环展开栈”的过程开始。
例14.1 处理零异常。
catch处理程序的出现顺序很重要,因为在一个try块中,异常处理程序是按照它出现的顺序被检查的。只要找到一个匹配的异常类型,后面的异常处理都将被忽略。例如,在下面的异常处理块中,首先出现的是catch(…),它可以捕获任何异常,在任何情况下,其他的catch语句都不被检查。因此,catch(…)应该放在最后。
Try{
//…
}
catch(…)
{
//只在这里处理所有的异常,
//后面的异常处理程序段不会被检查
}
catch(const char *str){
//…
}
catch(int){
//…
}
如果函数抛出了一个没有被列在异常规范中的异常会怎么样?程序只有在遇到某种不正常情况时异常才会被抛出。在编译时刻编译器不可能知道在执行时程序是否会遇到这些异常。因此一个函数的异常规范的违例只能在运行时刻才能被检测出来。如果函数抛出了一个没有被列在其异常规范中的异常,则系统调用C++标准库中定义的函数unexpected()。
unexpected()的缺省行为是调用terminate()。在某些条件下可能有必要改变unexpected()执行的动作,C++标准库提供了一种机制可让我们改变unexpected()的缺省行为:
(1)空的异常规范保证函数不会抛出任何异常,例如函数no_problem()保证不会抛出任何异常。
extern void no_problem() throw();
(2)如果一个函数声明没有指定异常规范,则该函数可以抛出任何类型的异常。在被抛出的异常类型与异常规范中指定的类型之间不允许类型转换。
(3)也可以在函数指针的声明处给出一个异常规范,例如:
void (*pf) (int) thr
您可能关注的文档
最近下载
- 人教版七年级数学上册第五章一元一次方程.pptx VIP
- 超星学习通网课《从爱因斯坦到霍金的宇宙》尔雅答案2025题目及答案.docx
- 证监会行业分类指引 2012版 (2).xls VIP
- 通信中级整理-终端与业务.pdf VIP
- 【初中数学】第五章一元一次方程单元测试+2024-2025学年人教版数学七年级上册.docx VIP
- 快乐日记(三上日记范文).docx VIP
- 4.1 《喜看稻菽千重浪》课件(共46张PPT)统编版高中语文必修上册.pptx VIP
- 群众安全满意度培训课件.pptx VIP
- 石材厂15万吨年砂石料加工项目突发环境事件应急预案2024年第一版.docx VIP
- 道德与法治人教版二年级上册教案.doc VIP
原创力文档


文档评论(0)