第12章 异常处理 C++自身有着非常强的纠错能力,发展到如今,已经建立了比较完善的异常处理机制. C++的异常情况无非两种,一种是语法错误,即程序中出现了错误的语句、函数结构和类,致使编译程序无法进行。另一种是运行时发生的错误,一般与算法有关。 关于语法错误, C++编译器的报错机制可以让我们轻松地解决这些错误;

Slides:



Advertisements
Similar presentations
2.5 函数的微分 一、问题的提出 二、微分的定义 三、可微的条件 四、微分的几何意义 五、微分的求法 六、小结.
Advertisements

面向侧面的程序设计 方林博士 本文下载地址:
面向对象程序设计 QQ群: Object-Oriented Programming 汽车学院.
Tool Command Language --11级ACM班 金天行.
Oracle数据库 Oracle 子程序.
第11章 异常处理 11.1 异常处理概述 11.2 异常处理的基本思想 11.3 C++异常处理的实现 11.4 标准C++库中的异常类
第14章 c++中的代码重用.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
全国计算机等级考试 二级基础知识 第二章 程序设计基础.
在PHP和MYSQL中实现完美的中文显示
Using C++ The Weird Way Something about c++11 & OOP tricks
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
4.3函数 4.3.1函数的概念及定义 1、函数的概念: 可以被其它程序调用具有 特定功能的一段相对独立的 程序(模块),称函数。
C#程序设计基础 $5 流程控制.
Signutil.
第七章 异常.
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
Object-Oriented Programming in C++ 第一章 C++的初步知识
第6章 异常的捕获及处理 6.1 异常简介 6.2 异常类的继承结构 6.3 异常处理机制 6.4 异常处理 6.5 本章小结.
$14 异常处理. $14 异常处理 异常处理 错误和异常 C#中异常处理结构 异常的层次结构 使用异常的原则和技巧.
第14讲 异常处理 1/.
走进编程 程序的顺序结构(二).
辅导课程六.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
Chapter 16 Exception Handling.
第5章 异常处理 王德俊 上海交通大学继续教育学院.
刘胥影 东南大学计算机学院 面向对象程序设计1 2010~2011第3学期 刘胥影 东南大学计算机学院.
第二章 Java语言基础.
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
第七章 操作符重载 胡昊 南京大学计算机系软件所.
第4章 PHP流程控制语句.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
1.3 C语言的语句和关键字 一、C语言的语句 与其它高级语言一样,C语言也是利用函数体中的可执行 语句,向计算机系统发出操作命令。按照语句功能或构成的不 同,可将C语言的语句分为五类。 goto, return.
C语言程序设计 主讲教师:陆幼利.
EBNF与操作语义 请用扩展的 BNF 描述 javascript语言里语句的结构;并用操作语义的方法描述对应的语义规则
简单介绍 用C++实现简单的模板数据结构 ArrayList(数组, 类似std::vector)
$9 泛型基础.
姚金宇 MIT SCHEME 使用说明 姚金宇
分裂对象模型 C++ otcl.
实验七 安全FTP服务器实验 2019/4/28.
第十章 异常处理   大型和十分复杂的程序往往会产生一些很难查找的甚至是无法避免的运行时错误。当发生运行时错误时,不能简单地结束程序运行,而是退回到任务的起点,指出错误,并由用户决定下一步工作。面向对象的异常处理(exception handling)机制是C++语言用以解决这个问题的有力工具。
第4章 Excel电子表格制作软件 4.4 函数(一).
第九节 赋值运算符和赋值表达式.
3.16 枚举算法及其程序实现 ——数组的作用.
第二章 类型、对象、运算符和表达式.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第八章 继承 C++语言程序设计.
授课老师:龚涛 信息科学与技术学院 2016年3月 教材:《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
第7章 模板 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
本节内容 C语言的汇编表示 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
本章主題 C++的程式結構 資料型態與宣告 算術運算 簡易的輸入輸出指令 程式編譯(Compile)的過程與原理.
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 动态链接库 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
3.7 Java的异常处理机制.
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
第2章 Java语言基础.
第6章 异常处理 陈哲 副教授 南京航空航天大学 计算机科学与技术学院.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
第二章 Java基础语法 北京传智播客教育
任课教师:戴开宇 TA:时均帅、谭肖、王安华 程序设计B班 :20-16:50(90分钟)
§2 自由代数 定义19.7:设X是集合,G是一个T-代数,为X到G的函数,若对每个T-代数A和X到A的函数,都存在唯一的G到A的同态映射,使得=,则称G(更严格的说是(G,))是生成集X上的自由T-代数。X中的元素称为生成元。 A变, 变 变, 也变 对给定的 和A,是唯一的.
第1章 C++程序设计基础 网络游戏开发-C++程序设计.
Presentation transcript:

第12章 异常处理 C++自身有着非常强的纠错能力,发展到如今,已经建立了比较完善的异常处理机制. C++的异常情况无非两种,一种是语法错误,即程序中出现了错误的语句、函数结构和类,致使编译程序无法进行。另一种是运行时发生的错误,一般与算法有关。 关于语法错误, C++编译器的报错机制可以让我们轻松地解决这些错误;

异常(exception)——程序运行期出现的问题或错误。 异常处理——结构化的处理异常的方法,在有可能发生异常的地方做出预见性的安排。 第二种是运行时的错误,常见的有文件打开失败、数组下标溢出、系统内存不足等等。而一旦出现这些问题,引发算法失效、程序运行时无故停止等故障也是常有的。这就要求我们在设计软件算法时要全面。比如针对文件打开失败的情况,保护的方法有很多种,最简单的就是使用“return”命令,告诉上层调用者函数执行失败;另外一种处理策略就是利用c++的异常机制,抛出异常。

代码有问题吗?如果有怎样去处理 通过这里例子引出传统的程序运行是错误处理方式, 即if判断 然后返回,程序结束。 传统的异常处理方式很不灵活,也不方便。

用 exit () 、 return ()或assert()运行期错误处理机制,具有“一个入口,多个出口”的特点,一旦检测到异常,程序崩溃。 非结构化异常处理: 用 exit () 、 return ()或assert()运行期错误处理机制,具有“一个入口,多个出口”的特点,一旦检测到异常,程序崩溃。 结构化的异常处理: 积极的运行期问题处理机制。当异常出现后,可按“警告—忽略”、“对话—补救”或安全退出等模式,使程序可以在对运行条件做出适当安排或改善后继续运行下去。 一个大的系统那个中,包含许多模块,每个模块又包含很多函数,函数之间又相互调用,比较复杂。如果在每一个函数中都设置处理异常的程序段,会使程序过于复杂和庞大。

12. 1 异常处理的基本语法 C++的异常处理的基本思想是将异常的检测与处理分离。 在一个函数体中检测到异常条件满足,但无法确定相应的处理方法时,就引发一个异常,然后由函数的直接或间接调用者处理此异常。 因此,如果在执行一个函数过程中,出现异常,可以不在本函数中立即处理,而是抛出一个异常,传给它的上一级(即调用它的函数),它的上级可以选择处理该异常,或者再往它的上级传递,如此逐级上升,如果最高一级还是无法处理,就调用系统函数terminate,使程序终止运行。

C++的异常处理建立在三个关键字基础之上: try 、catch和throw。 在C++中,其采用throw语句来实现,如果检测到产生异常,则抛出异常。如果在try语句块的程序段中(包括在其中调用的函数)发现了异常,且抛弃了该异常,则这个异常就可以被try语句块后的某个catch语句所捕获并处理,捕获和处理的条件是被抛弃的异常的类型与catch语句的异常类型相匹配。

以抛出对象来触发异常 C++异常处理语句的一般形式如下: try{ //try 块内监视异常 if (条件)throw exception; //由throw 抛出异常 …; //其它语句 } catch( 类型1 参数1 ){ //catch块内处理代码 catch( 类型2 参数2 ){ …; …… catch( 类型n 参数n ){ 以抛出对象来触发异常 本章重点语法 注意:C++通过try夺取运行期的环境控制权,异常的引发是由程序员控制的,而不是由程序编译器控制的。任何要检测异常的语句或函数调用都必须在try语句块中执行。异常由离try块最近的相应的catch语句来捕获并处理。

例12.1 异常处理演示。 void main() { invoke(0); invoke(1); invoke(2); } 例12.1 异常处理演示。 #include<iostream.h> const double PI=3.1416; void invoke(int x) { try{ if(x==0) throw x+5; //抛出int型的异常 if(x==1) throw 'A'; //抛出cahr型的异常 if(x==2) throw "An apple"; //抛出字符串型的异常 if(x==3) throw PI; //抛出double型的异常 } catch(int i) { cout<<"catch a integer "<<i<<endl; } catch(char c) { cout<<"catch a char "<<c<<endl; } catch(char str[10]) { cout<<"catch a string "<<str<<endl; } catch(double d) { cout<<"catch a double "<<d<<endl; } 通过这个例子讲解 try throw and catch 如何工作 程序运行结果: catch a integer 5 catch a char A catch a string An apple catch a double 3.1416

编写异常处理代码的规则: (1) 可以有数量不限的catch处理程序出现在try块之后,在try 块出现之前不能出现 catch块。

编写异常处理代码的规则: (2) 在关键字catch之后的圆括号内应包括数据和类型声明。因为捕获是根据throw exception 语句的异常类型与之匹配来实现的,它与一般函数的作用相似。如果在编写异常处理程序的函数带有参数,参数名仍可以传入catch 处理程序中。 catch 语法 注意和对象声明区别和联系

(3) 如果抛出一个异常,而在通往抛出函数的调用链中找不到与之匹配的catch处理程序,运行将以调用系统 terminate() 异常退出。 编写异常处理代码的规则: (3) 如果抛出一个异常,而在通往抛出函数的调用链中找不到与之匹配的catch处理程序,运行将以调用系统 terminate() 异常退出。 异常抛出后的处理机制

(4) 如果catch中处理程序执行完毕,而无返回或终止指令,将跳过后面的catch块继续执行程序。 编写异常处理代码的规则: (4) 如果catch中处理程序执行完毕,而无返回或终止指令,将跳过后面的catch块继续执行程序。

(5) 如果throw语句没有被执行,那么catch块将被忽略。 编写异常处理代码的规则: (5) 如果throw语句没有被执行,那么catch块将被忽略。 (6) 在实际运用中,throw执行前一定有一个条件判断。 这个判断条件非常关键,考察程序的健壮性

编写异常处理代码的规则: (7) throw 抛出的可以是一个常量,也可以是一个变量。关键字throw 还可以灵活地放到很多地方,只要try块中的语句能直接或间接地执行到它。

编写异常处理代码的规则: (8) catch在比较类型匹配时并不需要完全相同。被throw抛出的异常的数据类型与catch 处理程序的参数类型进行匹配的过程, 由精确匹配和自动数据类型转换的匹配组成。 在下列情况视为两者类型匹配: catch的参数类型与抛出异常严格匹配、 catch的参数类型是被抛出异常所在类的公有基类、 catch的参数类型是指向派生类的指针。 异常类型匹配, 回忆参数传递的匹配,模板参数的匹配知识

12. 2 异常捕获 12.2.1 单路捕获 单路捕获就是在程序中使用一个catch处理语句来捕获错误。这种处理比较简单。当C++异常处理语句一般格式式中 n=1 时,就是单路捕获。

例12.2 使用try…throw…catch编写一异常处理函数,对下列程序进行异常处理。 #include <iostream.h> #include <string.h> class CRange{ int x; public: CRange(int a){x=a;} int get_x(){return x;} }; class Range: public CRange{ Range(int b):CRange(b){};

class String{ char *contents; int length; public: String(char *str) { length=strlen(str); contents=new char[length+1]; strcpy(contents,str); } char& operator [](int j) { Range R(100); if(j>=0 && j<length) return contents[j]; throw R; } void print(String &s) { int j; for(j=0;j<20;j++) cout<<s[j]<<" "; cout<<endl; } };

int function(String &ss) { try{ ss.print(ss); } catch(CRange cr){ cout<<endl<<"Out of rangle!"<<endl; return cr.get_x(); return 0; void main() String x("abc"); int j=function(x); cout<<"function() returns: "<<j<<end;; 程序输出: a b c Out of rangle! function() returns: 100 (1) 由于在String类中重载了运算符[],重载函数又调用throw语句,故在函数print()中运行for 循环的s[j]时将会遇到异常抛出,根据条件在循环3次后将抛出异常。 (2) Range类的异常被function()函数中的catch捕获,是由于catch的参数类型CRange为Range的公有基类。

12.2.2 多路捕获 当C++异常处理语句格式中 n大于1时, 就构成多路捕获结构。多路捕获使得程序在出现一个异常时,可以由相应的处理程序进行有针对性的处理。多路捕获的异常处理比单路捕获更灵活,适用面更广.

多路捕获的一般规则: (1) 如果try块中的一个语句或者在try 块的一个被调函数中的一个语句抛出一个异常,在沿着调用返回时该异常到达第一个catch语句,逐个查看每个catch语句处理程序,根据被抛对象,找出匹配。注意,处理程序有一定的先后顺序。 注意: catch(...){ } 捕获任何类型的异常

多路捕获的一般规则: (2) 如果找到一个匹配,就执行匹配的处理程序代码。如果没有找到匹配,则检查下一个catch语句, 若所有的catch语句都找完了,还没有找到匹配的catch语句,就由调 用系统函数terminate()终止调用,后者按常规再调用abort0。

STL 提供的标准Exceptions C++的标准库提供了一个异常类的层次结构,在预定义的异常层次结构中,错误被分成两类:一是逻辑错误,由于程序内部逻辑而导致的错误,二是运行时错误,由于程序之外的某种事件而导致的错误 建议使用STL中提供的异常处理机制

STL 提供的标准Exceptions 标准STL异常例子讲解,是同学们了解如何使用

前面例子如何用异常处理方式进行改进