当前位置: 首页 > 文档资料 > C++大学教程 >

13.6 抛出异常

优质
小牛编辑
130浏览
2023-12-01

throw 关键字表示发生了异常,称为抛出异常。throw 通常指定一个操作数(我们将介绍不指定操作数的特殊情况)。throw 的操作数可以是任何类型,如果操作数是个对象,则称为异常对象。也可以抛出条件表达式而不是抛出对象,可以抛出不用于错误处理的对象。

抛出异常时,指定相应类型的最近一个异常处理器(对抛出该异常的try块)捕获这个异常。try块的异常处理紧接在try块后面。

抛出异常时,生成和初始化throw操作数的一个临时副本,然后这个临时对象初始化异常处理器中的参数。异常处理器执行完毕和退出时,删除临时对象。

软件工柱视点 13.5
如果需要传递导致异常的错误信息,则可以把这种信息放在抛出对象中。catch处理器包含引用该信息的参数名。

软件工程视点 13.6
也可以抛出对象而不传递信息,这时只要知道抛出这种类型的对象提供了异常处理器完成工作所需的足够信息。

抛出异常时,控制退出当前try块,进入try块后面相应的catch处理器(如果有)。抛出点也可能深深嵌套在try块内,控制仍将传入这个catch处理器;抛出点也可以深深嵌套在函数调用中,控制也会转人这个catch处理器。

try 块可能不包含错误检查和throw语句,但try块中所指的代码可能导致执行构造函数中的错误检查代码。try块代码可能对数组类对象加上数组下标,其operator[]成员函数可以重载成抛出下标超界错误的异常。任何函数调用均可调用可能抛出异常的代码或另一可能抛出异常的函数。

尽管异常可以终止程序执行,但也不一定需要终止程序执行。但异常会终止异常所在的程序块。

常见编程错误11.3
异常只能在try决中抛出,如果在try块之外抛出异常,则可能调用terminate。

常见编程错误13.4
可以抛出条件异常。但一定要小心,因为上升规则可能使条件表达式返回的值与所要类型不同。例如,从同一条件表达式抛出 int 或 double 时,条件表达式将int变成double。因此,结果总是由参数为 double 的处理器捕获,而不是有时由参数为double的处理器捕获,有时由参数为int的处理器捕获。