第7章异常处理资料

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
• 如果是无名参数(只指定匹配抛出对象类型的类型),则信 息不从抛出点传递到处理器中,只是控制从抛出点转到处 理器中.许多异常都可以这样。
• 例1 – throw myerror(“something bad happened”); – myerror是一个类,它以字符串变量为参数
• 例2 – throw int (5) – int是一个内部类型,5是一个int类型的常数
throw与其操作数
• 抛出异常的语句形式:
throw <可选的操作数>;
第7章 异常处理
• 写函数库的程序员可以检测到库函数运行时的错误(如数 组访问越界),但通常却不知道应该如何处理这些错误
• 异常处理的基本想法是,让一个函数在发现了自己无法处 理的错误时抛出一个异常,希望它的(直接或间接)调用 者能够处理这个问题。
异常处理
• 传统错误处理方法 • 异常处理机制
– 抛出异常 – 捕获异常 – 处理异常
• 异常规格说明
程序逻辑经常对决定程序下一步怎样执行的条件进行测试
执行一个任务 如果这个任务没有正确执行
则执行错误处理
执行下一个任务 如果该任务没有正确执行
则执行错误处理 …
传统错误处理方法
• 可以处理的错误在发生错误的地方就地处理 • 在检查到一个在局部无法处理的问题时,一个函数可以:
– 终止程序
– 使程序员可以删除程序执行“主线条”中的错误处理 代码,从而提高程序的可读性和可维护性。
异常处理基础简介
• 如果某段程序可能会抛出异常,则必须通知系统启动 异常处理机制。即通过try语句块实现。
• 异常处理代码的一般形式:
try{ 可能抛出异常的代码
}
Try语句块中包含了可能 抛出异常的代码,一旦抛 出了异常,则退出try语句 块,进入try后面的异常捕 获和处理
catch(类型1 参数1) { 处理该异常的代码 } catch(类型2 参数2) { 处理该异常的代码 } ……
异常处理
• 传统错误处理方法 • 异常处理机制
– 抛出异常 – 捕获异常 – 处理异常
• 异常规格说明
抛出异常
• 如果程序发生异常情况,而在当前的环境中获取不到异常处理 的足够信息,我们可以创建一包含出错信息的对象并将该对象 抛出当前环境,发送给更大的环境中。这称为异常抛出。
abort() /exit()
– 返回一个表示“错误”的值。
int
– 返回一个合法值,让程序处于某种非法的状态。
errno
– 调用一个预先准备好在出现“错误”的情况下用的函数。
处理错误的传统方法
• 处理错误的传统方法:错误处理代码是在整个系统代码中分 布的。代码中可能出错的地方都要当场进行错误处理。在写 程序时,必须知道所有的错误该如何处理 – 好处: 程序员阅读代码时能够直接看到错误处理情况,确 定是否实现了正确的错误检查。 – 问题: 代码中受到错误处理的“污染”,使应用程序本身 的代码更加晦涩难懂,难以看出代码功能是否正确实现。 这样就使代码的理解和维护更加困难。
• 异常规格说明
异常处理的基本思想
调用者
函数f()捕获并处理异常
调用关系
…… 异常传播方向
函数g()
函数h() 引发异常
8
异常处理
• C++的新异常处理特性: – 异常处理将检测发现错误的代码与处理错误的代码分 开来。程序员的工作也可做相应分工(例如,库函数 程序员负责检测异常,而调用库函数的另一程序员则 负责捕获与处理异常)。
• throw通常指定一个操作数(或不指定操作数的特殊情况) 。throw的操作数可以是任何类型,如果操作数是个对象, 则称为异常对象。也可以抛出条件表达式而不是抛出对象, 可以抛出不用于错误处理的对象。
• 抛出异常时,生成和初始化throw操作数的一个临时副本, 然后这个临时对象初始化异常处理器中的参数。异常处理器 执行完毕和退出时,删除临时对象。
面向对象中的异常处理
• 面向对象中,程序员经常做的是一些工具(类的设计 与实现)
• 这些工具能够检测出错误,但往往不知道该如何处理 错误。错误的处理是由工具的使用者决定
• 需要一种机制能将检测到的错误告诉使用者
异常处理
• 传统错误处理方法 • 异常处理机制
– 抛出异常 – 捕获异常 – 处理异常
const char *what() const { return message; }
};
告诉用户出现了什么异常
异常抛出实例 – 异常抛出 这条语句用默认构造函数生成
double Div(int x, int y )
了一个DivedeByZeroException 类的对象,并把这个对象返回
{
给调用它的函数,div函数执行
class DivideByZeroException {
private:
记录出现的异常情况
const char *message;
public: DivideByZeroException()
Message的默认值
: message( "attempted to divide by zero" ) { }
结束
if ( y == 0 )
throw DivideByZeroException();
return static_cast< double > ( x ) / y; }
异常处理
• 传统错误处理方法 • 异常处理机制
– 抛出异常 – 捕获异常 – 处理异常
• 异常规格说明
来自百度文库 异常捕获
• 一个函数抛出异常,它必须假定该异常 能被捕获和处理。异常捕获机制使得 C++可以把问题集中在一处解决。
异常抛出实例:
定义一个除法函数,当除数为0时,抛出一个用户 定义的异常类对象,该对象能告诉用户发生了除零 错误。
异常抛出实例 – 异常类定义
// Class DivideByZeroException to be used in exception
// handling for throwing an exception on a division by zero.
catch捕获异常
• 异常处理器放在catch块中, 形式如下: catch ( <捕获的异常类型> <可选参数> ) { <异常处理器代码> }
• catch处理器定义自己的范围。catch在括号中指定要捕获 的对象类型。catch处理器中的参数可以命名也可以无名。 如果是命名参数,则可以在处理器中引用这个参数。
相关文档
最新文档