- 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
第16章 异常和错误 程序运行时可能会出现这样那样的问题,比如说,文件打开不成功,内存耗尽等,通常,通过防错编码可以应付这些问题,但要求程序编写过程中对所有可能出的问题进行防错处理显然是不现实的,为此,C++提供了异常处理机制来解决运行时错误。首先来看一下编码时的防错机制。 16.1 编码时的防错 在文件输入输出一章中已经使用了编码时的防错,举例来说,调用流对象的is_open函数,如果返回true,证明文件打开成功,否则,文件打开失败,程序报警退出,这就是基本的防错处理,比只执行open函数却不检查是否成功的代码高明一步。 16.1.1 调用abort函数或exit函数 abort函数的原型位于头文件cstdlib中,无形参,abort函数的表现及返回值取决于不同的编译器和系统实现,一个典型实现(DOS下)是向标准错误输出流(cerr)发送“程序异常终止”(abnormal program termination)消息,并终止程序,见示例: 16.1.2 返回错误标志 当某些错误的发生时,使用abort函数或exit函数来结束程序似乎有点过激,实际上,通过返回错误标志,让上级调用函数做出判断,见代码16-2。 16.2 异常机制 除了人为防错外,还可以使用异常机制来处理错误,异常提供了将控制权从程序的一部分转移到另一部分的方法,对异常处理主要由3部分组成: 使用try块 异常发生时,使用throw抛出 使用catch块捕获异常 16.2.1 关键字throw throw关键字表示抛出异常,这实际上是条跳转语句,当程序执行到throw语句抛出异常时,直接跳出当前try块,执行对应的catch块,如果未定义捕获该异常类型的catch块时,默认的terminate函数将被执行,稍后会有相关介绍。 如此看来,throw操作实际上是将本函数中无法处理的错误或异常抛出到更高级别的代码域中进行处理。 C++提供了异常规范说明机制以显式说明函数所抛出的异常,方便使用者对程序进行处理,当然,异常规范说明不是必须的,在便没有进行异常规范说明。 16.2.2 异常处理程序 异常处理程序由一个或多个catch函数组成,每个catch函数块参数列表只能有一个参数,用于匹配由throw抛出的异常的类型,当try块中调用的函数可能抛出多种类型的异常时,需要多个catch函数形成异常捕获网,捕获所有可能的异常类型。异常处理程序紧接着try块,并且由关键字catch表示,如: 16.2.3 自定义异常对象 抛出类型可以是自定义的类对象,这样做的优点一方面在于可以使用不同的异常类型来区分不同函数在不同情况下引发的异常,另一方面,自定义的类对象可用来传递信息: 16.2.4 有继承关系的类异常 在有继承关系的类异常捕获处理上,有条原则:对某个catch块来说,如果其参数列表中是基类的类型,则其总是可以捕获基类和其派生类的异常对象,而如果catch块的参数列表中是派生类型,不能捕获基类的异常对象。 因此,为避免基类垄断的局面,推荐将用于捕获派生类的catch块写在上面,用于捕获基类的catch块写在下面,这保证了派生类先找到与其匹配的异常处理catch块,而最后再由基类找与其匹配的catch块。 16.2.5 terminate函数和set_terminate函数 如果try块抛出的异常没有任何一个catch块能与之批撇,一个特殊的库函数terminate()(在头文件exception中定义)会被自动调用。默认情况下,terminate()函数会调用标准C库函数abort()使程序执行异常而退出。 通过使用exception头文件中提供的set_terminate()函数,可以自定义terminate()函数,set_terminate()函数返回被替换的指向terminate()函数的指针(第一次调用set_terminate()函数时,返回函数库中默认的terminate()函数的指针),这样就可以在需要的时候恢复以前的terminate()函数。自定义的terminate()函数不能有参数,返回值必须是void,而且,必须无条件以某个结束语句,如调用exit函数或abort函数结束整个程序,换言之,如果terminate()函数被调用,意味着问题已无法解决,情况已不可收拾,必须结束程序。 16.2.6 unexpected函数与set_unexpected函数 当函数头中存在异常规范说明时,如果函数所抛出的异常没有列在异常规范说明中,系统将自动调用库函数unexpected(),该函数默认调用terminate函数结束程序。同时,还可以调用set_unexpected()库函数自定义unexpected函数,这和前面所讲的termi
文档评论(0)