第11章 异常处理 11.1 异常处理概述 11.2 异常处理的基本思想 11.3 C++异常处理的实现 11.4 标准C++库中的异常类

Slides:



Advertisements
Similar presentations
最大公因數與最小公倍數 吳嵐婷.  因數倍數消消樂  17 年蟬的秘密  最大公因數 ( 剪紙實例 )  利用標準分解式求最大公因數 ( 撲克牌活動 )  最大公因數應用問題  最小公倍數 ( 堆疊實例 )  最小公倍數應用問題 大綱.
Advertisements

與蓮邂逅於溽夏 我打江南走過,那等在季節裡 的容顏如蓮花的開落……。 鄭愁予<過 客>. 大家來賞蓮,蓮葉荷田田 你 知道嗎?蓮花就是荷花,荷花就是蓮花,但蓮屬豆科,睡蓮 是睡蓮科喔! 古象形字中,只有「荷」字代表「荷花」,因其子連蓬 而生,稱「連子」,後取諧音「蓮子」(可能因是植物,故 冠以草字頭),其花即是「蓮花」。
小学教育科研方法 主讲教师:李壮成(教授) 王振华(讲师) 范元涛(讲师).
导游风采—潘莉.
餐 飲 職 業 道 德 高雄市鳥松區衛生所 陳 國 彥.
Throw wide the gate and let the world come in.
美国人最爱说的一个单词是“try”。成都有个年轻人在研制一种安装折翼的可飞行汽车,在国内无人理睬,被认为是异想天开,可美国的一个机构却邀请他去美国“try”,并为他提供条件。其实,在中国也有敢于“try”的人。开放特区是“try”,“一国两制”也是“try”,只有具有创新意识的科学构想付诸实践,才能真正推动人类的进步、社会的发展。
田 径 运 动 概 述 牡丹江师范学院 王洪磊.
履歷表撰寫及面試技巧實務----- 基隆市職業總工會(數​位觀光人才養成班) 講師:王在正
非常教師 非常EQ 班級經營與正向管教 教育部多元入學與生涯發展/基測寫作宣導種子教師 [法治教育向下扎根]種子教師 前臺北縣青少年輔導團員 資深 訓導/輔導主任 石碇高中 簡單老師 部落格:簡單老師的聯絡簿.
Midterm Work 類別是綜合性服務 4A0K0049 邱珮甄(組長) 4A0K0050 駱郁琦 4A0K0055 陳盈欣
100年高中(南區)衛生組長研習 如何落實學校餐飲自主管理 國立南科國際實驗高級中學 張簡俊杰 營養師.
Get Lucky!助你好運! 劉軒,天下文化出版,2014。 范滿妹導讀
生命教育 认识生命 欣赏生命 珍爱生命.
2012高考历史一轮复习(人民版)精品课件:第15讲 美苏争锋
課程計畫與教師角色 第二章.
第13章 计算机的日常维护与故障检测 13.1 计算机的日常维护和保养 计算机对环境的要求
第3章 JavaScript语言基础.
14 JavaScript语言基础 JavaScript是一种轻量级、解释型的Web开发语言。所谓轻量级,就是语言的体系结构不是很庞杂,例如,没有C、Java等语言中的类、内存管理、系统管理等高深的知识范畴;所谓解释型,就是语言在浏览器或服务器等环境中直接被解释执行,不需要对源代码进行编译操作。
第二章 JAVA语言基础.
例外與檔案處理 例外處理 拋出例外 串流 Stream FileReader、FileWriter
第5章 异常处理 王德俊 上海交通大学继续教育学院.
S 数控机床故障诊断与维修.
例外處理(Exception Handling)
Java基础 JavaSE异常.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
西南科技大学网络教育系列课程 高级语程序设计(Java) 第五章 继承、接口与范型.
西安交通大学 计算机教学实验中心 大学C++程序设计教程 西安交通大学 计算机教学实验中心
授课老师:龚涛 信息科学与技术学院 2018年3月 教材: 《Visual C++程序员成长攻略》 《C++ Builder程序员成长攻略》
哥林多后书.
Synthetic Chemical Experiment
第 14 章 例外處理.
Java语言程序设计 第五部分 Java异常处理.
第三章 流程控制與例外處理 資訊教育研究室 製作 注意:本投影片僅供上課使用,非經同意,請勿散播或轉載。
复习 JavaScript && ES6 专题 (1) 2017/3/10 – Payne
Synthetic Chemical Experiment
PHP5與MySQL5 入門學習指南 凱文瑞克 著 第 17 章 物件.
9.1 程式偵錯 9.2 捕捉例外 9.3 自行拋出例外 9.4 自定例外類別 9.5 多執行緒
$16 进程和线程. $16 进程和线程 进程 进程 属性 ProcessName / Id MachineName / MainModule BasePriority StartTime / ExitTime TotalProcessorTime / UserProcessorTime PrivateMemorySize64.
刘胥影 东南大学计算机学院 面向对象程序设计1 2010~2011第3学期 刘胥影 东南大学计算机学院.
异常及处理.
Java程序设计 第2章 基本数据类型及操作.
第3章 什么是货币.
編譯程式設計 期末專題說明 V1.1 May 2004.
第2章 MATLAB程序设计 编者.
第五讲 酒店客房管理系统(一) 教育部“十二五”职业教育国家规划教材
Ajax编程技术 第六章 调试与错误处理.
潘爱民 C++ Overview 潘爱民
第二单元 第2课 Matlab程序控制结构 1.顺序结构 2.选择结构 3.循环结构.
Synthetic Chemical Experiment
利用JAVA DOM 進行DTD驗證XML文件
第7章 异常处理.
第十二章 命名空间和异常处理 丘志杰 电子科技大学 计算机学院 软件学院.
Oop8 function函式.
第3章 JavaScript基本语句.
C++ 與 物件導向 程式設計概念簡介 魏天君 2019/5/3.
第二章 Java语法基础.
#include <iostream.h>
第二章 Java基本语法 讲师:复凡.
Java程序设计 第17章 异常和断言.
第七課 有聲無影妙趣多 第七課 有聲無影妙趣多 國中藝術與人文 2上.
指導老師:楊子青 資管二A 卓柔錡 資管二A 黃建錡 資管二A 許鈞富 資管二A 陳超瑝 資管二B 鄭育璿
C++面向对象程序设计 谭浩强编著 授课教师:姬广永 学习网站:
第2章 Java语言基础.
第4讲 类和对象、异常处理 ggao.
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
第二章 Java基础语法 北京传智播客教育
100 – 2 學年度 校外家教經驗分享 分享人:陳彥文同學 醫學系二年級.
攜手玩廣告.
因數與倍數 應用 福科國中 李如盈老師.
Presentation transcript:

第11章 异常处理 11.1 异常处理概述 11.2 异常处理的基本思想 11.3 C++异常处理的实现 11.4 标准C++库中的异常类 第11章 异常处理 11.1 异常处理概述 11.2 异常处理的基本思想 11.3 C++异常处理的实现 11.4 标准C++库中的异常类 11.5 多路捕获 11.6 含有异常的程序设计

在编写程序时,应该考虑确定程序可能出现的错误,然后加入处理错误的代码。也就是说,在环境条件出现异常情况下,不会轻易出现死机和灾难性的后果,而应有正确合理的表现。这就是异常处理。C++提供了异常处理机制,它使得程序出现错误时,力争做到允许用户排除环境错误,继续运行程序。

11.1 异常处理概述 程序可能按编程者的意愿终止,也可能因为程序中发生了错误而终止。例如,程序执行时遇到除数为0或下标越界,这时将产生系统中断,从而导致正在执行的程序提前终止。 程序的错误有两种,一种是编译错误,即语法错误。如果使用了错误的语法、函数、结构和类,程序就无法被生成运行代码。另一种是在运行时发生的错误,它分为不可预料的逻辑错误和可以预料的运行异常。

为处理可预料的错误,常用的典型方法是让被调用函数返回某一个特别的值(或将某个按引用调用传递的参数设置为一个特别的值),而外层的调用程序则检查这个错误标志,从而确定是否产生了某一类型的错误。另一种典型方法是当错误发生时跳出当前的函数体,控制转向某个专门的错误处理程序,从而中断正常的控制流。这两种方法都是权宜之计,不能形成强有力的结构化异常处理模式。 异常处理机制是用于管理程序运行期间错误的一种结构化方法。所谓结构化是指程序的控制不会由于产生异常而随意跳转。异常处理机制将程序中的正常处理代码与异常处理代码显式区别开来,提高了程序的可读性。

11.2 异常处理的基本思想 对于中小型程序,一旦发生异常,一般是将程序立即中断执行,从而无条件释放系统所有资源。而对于比较大的程序来说,如果出现异常,应该允许恢复和继续执行。恢复的过程就是把产生异常所造成的恶劣影响去掉,中间一般要涉及一系列的函数调用链的退栈,对象的析构,资源的释放等。继续运行就是异常处理之后,在紧接着异常处理的代码区域中继续运行。

11.3 C++异常处理的实现 C++语言异常处理机制的基本思想是将异常的检测与处理分离。当在一个函数体中检测到异常条件存在,但无法确定相应的处理方法时,将引发一个异常,并由函数的直接或间接调用检测并处理这个异常。这一基本思想用3个保留字实现:throw、try和catch。其作用是: (1)try:标识程序中异常语句块的开始。 (2)throw:用来创建用户自定义类型的异常错误。 (3)catch:标识异常错误处理模块的开始。

在一般情况下,被调用函数直接检测到异常条件的存在并使用throw引发一个异常(注意,C++语言的异常是由程序员控制引发的,而不是由计算机硬件或程序运行环境控制的);在上层调用函数中使用try检测函数调用是否引发异常,检测到的各种异常由catch捕获并作相应处理。 11.3.1 异常处理的语法 在C++程序中,任何需要检测异常的语句(包括函数调用)都必须在try语句块中执行,异常必须由紧跟着try语句后面的catch语句来捕获并处理。因而,try与catch总是结合使用。throw、try和catch语句的一般语法如下:

throw <表达式>; try { //try语句块 } catch(类型1 参数1) //针对类型1的异常处理 catch (类型2 参数2) //针对类型2的异常处理 … catch (类型n 参数n) //针对类型n的异常处理

异常处理的执行过程如下: (1)控制通过正常的顺序执行到达try语句,然后执行try块内的保护段。 (2)如果在保护段执行期间没有引起异常,那么跟在try块后的catch子句就不执行,程序从异常被抛掷的try块后跟随的最后一个catch子句后面的语句继续执行下去。 (3)如果在保护段执行期间或在保护段调用的任何函数中有异常被抛掷,则从通过throw运算数创建的对象中创建一个异常对象。编译器从能够处理抛掷类型的异常的更高执行上下文中寻找一个catch子句(或一个能处理任何类型异常的catch处理程序)。catch处理程序按其在try块后出现的顺序被检查。如果没有找到合适的处理程序,则继续检查下一个动态封闭的try块。此处理继续下去直到最外层的封闭try块被检查完。

(4)如果匹配的处理器未找到,则运行函数terminate将被自动调用,而函数terminate的默认功能是调用abort终止程序。 (5)如果找到了一个匹配的catch处理程序,且它通过值进行捕获,则其形参通过拷贝异常对象进行初始化。如果它通过引用进行捕获,则参量初始化为指向异常对象。在形参被初始化之后,开始“循环展开栈”的过程,这包括对那些在与catch处理器相对应的try块开始和异常丢弃地点之间创建的(但尚未析构的)所有自动对象的析构。析构以与构造相反的顺序进行。然后执行catch处理程序,接下来程序跳转到跟随在最后处理程序之后的语句。 注意:catch处理程序的出现顺序很重要,因为在一个try块中,异常处理程序是按照它出现的顺序被检查的。

11.3.2 异常处理的规则 (1)try分程序必须出现在前,catch紧跟出现在后。catch之后的圆括号中必须含有数据类型,捕获是利用数据类型匹配实现的。 (2)如果程序内有多个异常错误处理模块,则当异常错误发生时,系统自动查找与该异常错误类型相匹配的catch模块.查找次序为catch出现的次序。 (3)如果异常错误类型为C++的类,并且该类有其基类,则应该将派生类的错误处理程序放在前面,基类的错误处理程序放在后面。 (4)如果一个异常错误发生后,系统找不到一个与该错误类型相匹配的异常错误处理模块,则调用预定义的运行时刻终止函数,默认情况下是abort。

11.4 标准C++库中的异常类 标准C++库中包含9个异常类,它们可以分为运行时异常和逻辑异常: length_error //运行时长度异常 domain_error //运行时域异常 out_of_range_error //运行时越界异常 invalid_argument //运行时参数异常 range_error //逻辑异常,范围异常 overflow_error //逻辑异常,溢出(上)异常 overflow_error //逻辑异常,溢出(下)异常 标准C++库中的这些异常类并没有全部被显式使用,因为C++标准库中很少发生异常,但是这些标准C++库中的异常类可以为编程人员,特别式自己类库的开发者提供一些经验。

11.5 多路捕获 很多程序可能有若干不同种类的运行错误,它们可以使用异常处理机制,每种错误可与一个类,一种数据类型或一个值相关。这样,在程序中就会出现多路捕获。 例11-5

11.6 含有异常的程序设计 11.6.1 何时避免异常 异常并不能处理所发生的所有问题。实际上若对异常过分的考虑,将会遇到许多麻烦。下面的段落指出异常不能被保证的情况。 1. 异步事件 2. 普通错误情况 3. 流控制 4. 不强迫使用异常 5. 新异常,老代码

11.6.2 异常的典型使用 1. 随时使用异常规格说明 2. 起始于标准异常 3. 套装用户自己的异常 4. 使用异常层次 5. 多重继承 11.6.2 异常的典型使用 1. 随时使用异常规格说明 2. 起始于标准异常 3. 套装用户自己的异常 4. 使用异常层次 5. 多重继承 6. 用“引用”而非“值”去捕获 7. 在构造函数中抛出异常 8. 不要在析构函数中导致异常 9. 避免无保护的指针