版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
CC++程序设计序设计宋存利第十章C++异常处理大连交通大学本章知识要点C++异常异常类型和多级catchC++中常用的异常类自定义异常类异常说明10.1C++异常C++程序中存在的错误分为语法错误、逻辑错误和运行时错误三类:语法错误是指代码不符合C++语法规则。语法错误是最容易发现、定位和排除的错误,这类错误在C++程序的编译阶段就能被发现。逻辑错误是指代码处理逻辑有问题,不能达到程序员期望的目标。逻辑错误一般可以通过C++集成开发环境提供的交互式调试工具来找到并修正。运行时错误是指代码在运行期间发生的错误。
异常(Exception)处理机制是为了解决运行时错误而引入的。10.1C++异常【例10-1】异常案例。
此案例为访问一个字符串发生越界的案例。具体实现为tenth_1.cpp10.1.1捕获异常【例10-1】中的异常可以借助C++提供的异常处理机制来捕获,避免程序崩溃。C++捕获异常的语法为:try{//可能抛出异常的语句块}catch(ExceptionTypee)//ExceptionType为一种数据类型{//异常处理语句块}10.1.1捕获异常【例10-2】:修改【例9-1】的代码,加入捕获异常的语句。C++中异常处理的基本流程是:
函数A在执行过程中发现异常时可以不加处理,而只是“拋出一个异常”给A的调用者,假定A的调用者为函数B。在这种情况下,函数B可以选择捕获A拋出的异常并进行处理。如果B置之不理,这个异常就会被拋给B的调用者,以此类推。如果一层层的函数都不处理异常,异常最终会被拋给main函数,main函数应该处理异常。如果main函数也不处理异常,那么程序就会立即异常地中止。注意:C++的库函数,它们大部分都只是完成相应功能,对发生的异常情况不做处理,而是抛出异常给它们的调用者。因此调用这类函数要注意异常的捕获处理。具体实现为tenth_2.cpp10.1.2抛出异常C++中,使用throw关键字来报告异常,也就是显式地抛出异常,语法格式为:
throwExceptionData;其中,ExceptionData是“异常数据”,它可以是int、float、bool等内置类型,也可以是指针、结构体、对象等复杂结构类型的数据。可以包含任意的异常信息,由程序员根据实际应用需求设置。【例9-3】利用throw抛出异常的例子。具体实现为tenth_3.cpp,tenth_3_1.cpp101.3发生异常的位置异常可以发生在当前的try块中,也可以发生在try块所调用的某个函数中,或者是所调用的函数又调用了另外的一个函数,这个另外的函数中发生了异常。这些异常,都可以被try检测到。【例10-5】演示try块中直接抛出异常。【例10-6】演示try块中调用的某个函数执行时发生了异常。【例10-7】演示try块中调用了某个函数,该函数又调用了另外的一个函数,这个另外的函数抛出了异常。
具体实现为tenth_7.cpp具体实现为tenth_5.cpp具体实现为tenth_6.cpp异常的再次抛出在catch块中,有时虽然捕获了异常,但还是想让该函数的上级调用者知道发生了什么异常,以便让上一级调用者去处理,此时就可以在catch块中,用throw语句再次将此异常抛出。其语法为:try{//问题解决语句}catch(e){//异常处理语句throw;//抛出e异常}【例10-4】catch块中拋出异常,将问题再次抛给上一级的调用函数来处理,注意函数compute_discount的catch块。具体实现为tenth_4.cpp10.2异常类型和多级catch1异常类型ExceptionType指明了当前的catch块可以捕获处理的异常类型。e是catch的局部变量,用来接收程序抛出的异常信息。当异常发生后,若相应的try块检测到异常,则会将异常数据传递给与其对应的catch块,当异常信息与catch后的异常类型参数e的类型匹配,则异常数据会被传递给参数e,并执行catch块中的异常处理语句,否则catch不会接收这份异常数据,也不会执行catch块中的语句。C++规定:ExceptionType的类型可以是int、char、float、bool等基本类型,也可以是指针、数组、字符串、结构体、类等聚合类型。C++语言本身以及标准库中的函数抛出的异常,都是exception(头文件为exception)类或其子类的异常。10.2异常类型和多级catch2.多级Catch
一个try后面可以跟多个catch,称为多级catch。多级catch的语法格式:
try{//可能抛出异常的语句}catch(ExceptionType1e){//处理ExceptionType1类型异常的语句}catch(ExceptionType2e){//处理ExceptionType2类型异常的语句}…….catch(ExceptionTypeNe){//处理ExceptionTypeN类型异常的语句}10.2异常类型和多级catch【例10-8】多级catch的使用案例。思考:在【例10-8】的案例中,B类错误被A类的catch提前捕获了,因此B类错误将不会被之后的catch(B)捕获,那有人问如果在该案例中想捕获B类错误,又想捕获A类错误,同时采用不同的处理方式处理该怎么办?具体实现为tenth_8_1.cpp具体实现为tenth_8.cpp10.2异常类型和多级catchcatch在匹配过程中的类型转换catch在匹配异常类型的过程中也会进行类型转换,其支持的类型转换有:(1)向上转型:将派生类向基类转换。(2)const转换:将非const类型转换为const类型。(3)数组或函数指针转换:如果函数形参不是引用类型,那么数组名会转换为数组指针,函数名也会转换为函数指针。10.3C++中常用的异常类C++标准库中有一些异常类,这些类都是从exception类派生而来的。10.3C++中常用的异常类bad_typeid
使用typeid运算符时,如果其操作数是一个多态类的指针,而该指针的值为NULL,则会拋出bad_typeid异常。bad_cast
在用dynamic_cast进行从多态基类对象(或引用)到派生类的引用的强制类型转换时,如果转换是不安全的,则会拋出此异常。【例10-9】演示bad_cast异常类的使用。具体实现为tenth_9.cpp10.3C++中常用的异常类bad_alloc
在用new运算符进行动态内存分配时,如果没有足够的内存,则会引发此异常。out_of_rangeout_of_range所在的头文件为<stdexcept>中。当用vector或string的at成员函数根据下标访问元素时,如果下标越界,则会拋出此异常。【例10-10】演示bad_alloc异常类的使用。具体实现为tenth_10.cpp【例10-11】演示out_of_range异常类的使用。具体实现为tenth_11.cpp10.4自定义异常类自定义异常类有两个好处:1)C++标准库中的异常类数目有限,因此可以为程序中特定的错误创建更有意义的类,而不是使用具有通常名称的异常类,例如exception类。2)可以通过继承exception类来定义新的异常类,并加入自定义的异常输出信息。注意:异常类的定义和普通类的定义没有区别。【例10-12】自定义MyException类,并重写标准exception异常类中的what()成员函数。具体实现为tenth_12.cpp10.5异常说明在函数声明时可以在函数头部说明该函数抛出的错误类型,这是一个好的习惯,这样做,可以使得该函数的调用者知道该函数抛出的异常有哪些,从而注意捕获这些异常,对它们进行处理而不是放任不管。在函数头部声明异常的一般格式为:
返回值类型
函数名(函数参数列表)throw(异常类型列表)
其中,异常类型列表中只需要列出异常的类型即可,不同异常类型之间用逗号隔开。【例10-13】在函数定义时同时声明函数抛出的异常类型。下面是一个根据三角形三边长度判断三边是否构成一个合法三角形的案例。具体实现为tenth_13.cpp本章小结异常处理目的是提高程序的健壮性。异常处理可以将正常程序代码和异常处理代码分开,从而使得程序结构更清晰,易于理解和维护程序。同时异常处理可以将异常抛给函数的调用者去处理。异常处理的三剑客,throw语句负责抛出异常,try块负责检测异常,catch块捕获异常并进行处理。其中catch块要与try
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 宜昌市地理信息和规划编制研究中心招聘专业技术人员笔试真题及答案
- 2025年丽水市市级机关遴选公务员考试试卷真题
- 胃癌诊断性腹腔镜探查专家共识总结2026
- 2026年小学六年级语文第二学期期末考试卷及答案(十四)
- 经络腧穴精准定位
- 2021年聚醚行业研究报告
- 幼儿园中班科学教案《旋转的纸片》
- 译林版英语六年级下册Unit 8 Our dreams SoundSong cartoon time
- (2026年)校园欺凌的预防和处理制度范本
- 心理治疗师规范化培训与督导
- 2026年春季学期人教版小学数学五年级下册期末质量检测卷含答案
- 2026年湖南长沙新奥燃气有限公司社会招聘5人考试参考题库及答案解析
- 2026年安全生产月知识竞赛试题(7套完整版 含答案)
- 2026年全国安全生产月主题培训
- 2025年江苏省中考道德与法治试题及答案解析
- 2026年4月自考07816公共行政学试题及答案含评分参考
- 放射性肠炎治疗管理
- (正式版)JJD 008-2026 房屋建筑和市政基础设施工程安全管理资料导则(试行)
- 物理教学方法交流
- 高速磁浮无线通信系统试验规范标准文本(含编制说明)-2024
- 2026年二级建造师之二建机电工程实务真题含答案详解
评论
0/150
提交评论