第12章 异常处理.

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

找到一个匹配的catch异常处理后: 初始化参数。 将从对应的try块开始到异常被抛掷 处之间构造(且尚未析构)的,所 有自动对象进行析构。 从最后一个catch处理之后开始恢复 执行。
07:56
17/30
面向对象程序设计(C++描述)
例2 异常处理时的析构(重点掌握)
#include <iostream> void MyFunc( void ); class Expt { //自编的异常处理类 public: Expt( ) { }; ~Expt( ) { }; const char* ShowReason( ) const { return "Expt类异常。"; } };
4/30
面向对象程序设计(C++描述)
异常处理的基本思想
调用者 函数f( )捕获并处理异常
调用关系
……
异常传播方向
函数g( )
函数h( )
07:56
引发异常
5/30
面向对象程序设计(C++描述)
异常处理的实现机制

抛掷异常的程序段 ...... throw ......

表达式;
捕获并处理异常的程序段 try 复合语句 catch(异常类型声明) 复合语句 catch(异常类型声明) 复合语句 …
wk.baidu.com
异常处理语法(捕获异常)

catch块 catch ( 类型 参数) //类型为基本数据类型或类类型 { // 异常处理语句块 } catch( … ) // 可捕获处理任意类型的异常 { // 异常处理语句块 }
07:56
9/30
面向对象程序设计(C++描述)
例1 处理除零异常
#include <iostream> int Div( int x, int y); int main( ) { try { cout << "5/2 = " << Div(5,2) << endl; cout << "8/0 = " << Div(8,0) << endl; cout << "7/1 = " << Div(7,1) << endl; } catch( int ) { cout << "except of deviding zero.\n"; } cout << "that is ok.\n"; 程序运行结果如下: } 5/2 = 2 int Div( int x, int y ) { except of deviding zero. if(y == 0) that is ok. throw y; return x / y; 10/30 }07:56
07:56 18/30
面向对象程序设计(C++描述)
class Demo { public: Demo( ); ~Demo( ); }; Demo::Demo( ) { cout << "构造 Demo。" << endl; } Demo::~Demo( ) { cout << "析构 Demo。" << endl; }
面向对象程序设计(C++描述)
异常的重新抛出

如果异常处理程序捕获到异常后,无法确定异常的 处理方式,须再抛出传递。这些工作通过加入不带 参数的throw就可完成: catch( . . . ) { cout << "an exception was thrown " << endl; throw; }
面向对象程序设计(C++描述)
异常处理
面向对象程序设计(C++描述)
本章主要内容

异常处理的基本思想 C++异常处理的实现
抛出异常throw 捕获异常try,catch

07:56
异常处理中的构造与析构 异常规格说明
2/30
面向对象程序设计(C++描述)
什么是异常?



应用程序要具有容错能力,当发生意外时也可作 出适当处理,不会导致严重后果。所谓异常,包 括用户误操作、外部设备或文件连接不正确、内 存不足等。 传统的处理方法是使用中断指令,如abort, assert, exit, return, 错误处理代码掺杂于功能实现代码, 降低了程序的可读性和可维护性, 而且不适合于 代码重用。 c++的异常处理允许程序以结构化和顺序化的方 式处理反常和意外的情况。
3/30
07:56
面向对象程序设计(C++描述)
异常处理的基本思想

将异常检测与处理分离,出现异常的函数不需 具备处理异常的能力。

当一个函数发生异常时,它抛出一个异常,调 用者捕获并处理该异常。若调用者不能处理, 还可抛出给上一级调用者处理,直至运行系统。 若仍不能处理,将简单终止程序。
07:56
7/30
07:56
面向对象程序设计(C++描述)
异常处理语法(抛出异常)

try 块 try { // 需保护的测试块 } throw语句 throw 表达式;
// 表达式可以是任意类型的对象

// throw语句必须在try块、catch块或其调用的函数中执行
07:56
8/30
面向对象程序设计(C++描述)
07:56 19/30
11/30
07:56
面向对象程序设计(C++描述)
在构造函数中抛出异常

由于C++的构造函数没有返回值,适合用异 常机制解决创建对象失败问题。 当创建对象失败,在构造函数中抛出一个异常, 由创建对象的函数捕获并处理异常。

07:56
12/30
面向对象程序设计(C++描述)
异常处理中的构造与析构

07:56
6/30
面向对象程序设计(C++描述)
异常处理的实现机制



若有异常则通过throw操作创建一个异常对象并抛掷。 将可能抛出异常的程序段嵌在try块中。控制通过正常的 顺序执行到达try语句,然后执行try块内的保护段。 如果在保护段执行期间没有引起异常,那么跟在try块后 的catch子句就不执行。程序从try块后跟随的最后一个 catch子句后面的语句继续执行下去。 catch子句按其在try块后出现的顺序被检查。匹配的catch 子句将捕获并处理异常(或继续抛掷异常)。 catch(…)可以捕获任何异常,所以建议放在catch子句的 最后。 如果匹配的处理器未找到,则运行函数terminate将被自 动调用,其缺省功能是调用abort终止程序。
相关文档
最新文档