第12章+异常处理.
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
int main( ) {
CD derived;
try { throw derived; }
catch( CB b ) {
cout << "Catch a base class: ";
b.print();
}
catch( CD d ) {
cout << "Catch a Derived class";
00:27
29/30
面向对象程序设计(C++描述)
布置作业(续)
5、练习使用try、catch语句,在程序中用new分配内 存时,如果操作未成功,则用try语句触发一个char类 型异常,用catch语句捕获此异常。声明char *ptr[10];, 为该数组的每个元素分配1000000000字节的内存。 6(思考题,选做)、编写一个简单的异常处理类 CDivideByZeroException,其中提供异常处理信息。 在主函数中用try检测除数为0的异常情况,然后在除法 运算函数quotient()中用throw抛出异常,最后用catch 捕捉并处理除数为0的异常。
00:27
19/30
面向对象程序设计(C++描述)
void MyFunc( ) { Demo D; cout << "在MyFunc( )中抛掷Expt类异常。" << endl; throw Expt( ); //构建异常对象,并抛出
} int main( ) {
cout << "在main函数中。" << endl; try {
传统的处理方法是使用中断指令,如abort, assert, exit, return, 错误处理代码掺杂于功能实现代码, 降低了程序的可读性和可维护性, 而且不适合于 代码重用。
c++的异常处理允许程序以结构化和顺序化的方 式处理反常和意外的情况。
00:27
3/30
面向对象程序设计(C++描述)
1 异常处理的基本思想
2 C++异常处理的实现
3 异常处理中的构造与析构
4 异常规格说明
5 异常是错误的事件或运行期间发生的反常,有两种类型:
同步异常,在运行期间产生并可使用throw抛出
异步异常,由硬件或运行环境引起的异步错误
6 异常处理是c++一个特性,它支持以一种标准的方式处理 错误,即通过关键字throw, try, catch实现。
catch子句按其在try块后出现的顺序被检查。匹配的catch 子句将捕获并处理异常(或继续抛掷异常)。
catch(…)可以捕获任何异常,所以建议放在catch子句的 最后。
如果匹配的处理器未找到,则运行函数terminate将被自 动调用,其缺省功能是调用abort终止程序。
00:27
using namespace std;
int main( ) { cout << "开始" << endl; try { cout << "进入try块" << endl; throw 999; cout << "该语句不应执行"; }
catch( int i ) { cout << "捕捉的异常为:"; cout << i << endl;
找到一个匹配的catch异常处理后: 初始化参数。 将从对应的try块开始到异常被抛掷 处之间构造(且尚未析构)的,所 有自动对象进行析构。 从最后一个catch处理之后开始恢复 执行。
00:27
17/30
面向对象程序设计(C++描述)
例2 异常处理时的析构(重点掌握)
#include <iostream> void MyFunc( void ); class Expt { //自编的异常处理类 public:
d.print();
}
00:27
}
28/30
面向对象程序设计(C++描述)
布置作业(续)
4、分析以下程序的执行结果,并说明原因。 using namespace std; void ExFun( ) {
try { throw "Welcome"; } catch( char * ) {
cout << "Catch inside ExFun" << endl; throw; } } int main( ) { try { ExFun( ); } catch( char * ) { cout << "Catch inside Main" << endl; } }
00:27
6/30
面向对象程序设计(C++描述)
异常处理的实现机制
若有异常则通过throw操作创建一个异常对象并抛掷。
将可能抛出异常的程序段嵌在try块中。控制通过正常的 顺序执行到达try语句,然后执行try块内的保护段。
如果在保护段执行期间没有引起异常,那么跟在try块后 的catch子句就不执行。程序从try块后跟随的最后一个 catch子句后面的语句继续执行下去。
00:27
11/30
面向对象程序设计(C++描述)
在构造函数中抛出异常
由于C++的构造函数没有返回值,适合用异 常机制解决创建对象失败问题。
当创建对象失败,在构造函数中抛出一个异常, 由创建对象的函数捕获并处理异常。
00:27
12/30
面向对象程序设计(C++描述)
异常处理中的构造与析构
异常处理的基本思想
将异常检测与处理分离,出现异常的函数不需 具备处理异常的能力。
当一个函数发生异常时,它抛出一个异常,调 用者捕获并处理该异常。若调用者不能处理, 还可抛出给上一级调用者处理,直至运行系统。 若仍不能处理,将简单终止程序。
00:27
4/30
面向对象程序设计(C++描述)
异常处理的基本思想
调用者 函数f( )捕获并处理异常
调用关系 …… 异常传播方向
函数g( )
函数h( ) 引发异常
00:27
5/30
面向对象程序设计(C++描述)
异常处理的实现机制
抛掷异常的程序段
...... throw ......
表达式;
捕获并处理异常的程序段 try 复合语句 catch(异常类型声明) 复合语句 catch(异常类型声明) 复合语句 …
using namespace std;
class CB {
public:
void print(){ cout << "Catch the class CB" << endl; }
};
class CD: public CB {
public: void print( ) { cout << "Catch the class CD" << endl; } };
00:27
23/30
面向对象程序设计(C++描述)
异常接口声明
(2)不抛出异常,如: void f ( ) throw ( ); // 函数f()不抛出任何类型的异常
(3)抛出任意类型的异常,如: void f ( );
00:27
百度文库
24/30
面向对象程序设计(C++描述)
本章小结
本节课主要介绍了如下内容:
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块 catch ( 类型 参数) //类型为基本数据类型或类类型 { // 异常处理语句块 } catch( … ) // 可捕获处理任意类型的异常 { // 异常处理语句块 }
00:27
9/30
例1 处理除零异常 面向对象程序设计(C++描述)
#include <iostream>
throw y;
that is ok.
return x / y;
}00:27
10/30
面向对象程序设计(C++描述)
异常的重新抛出
如果异常处理程序捕获到异常后,无法确定异常的 处理方式,须再抛出传递。这些工作通过加入不带 参数的throw就可完成: catch( . . . ) { cout << "an exception was thrown " << endl; throw; }
7/30
面向对象程序设计(C++描述)
异常处理语法(抛出异常)
try 块 try { // 需保护的测试块 }
throw语句 throw 表达式;
// 表达式可以是任意类型的对象 // throw语句必须在try块、catch块或其调用的函数中执行
00:27
8/30
面向对象程序设计(C++描述)
try块包含一个throw语句的测试块
throw产生一个异常给异常处理器
catch异常处理器必须在try块之后
00:27
25/30
面向对象程序设计(C++描述)
布置作业
编程并上机验证:
1、编译运行以下代码,体会异常处理3个关键字try、catch和throw的作 用,并写出运行结果。
} cout << "结束"; }
00:27
26/30
面向对象程序设计(C++描述)
布置作业(续)
2、分析以下代码,写出运行结果,并与题1对比分析运行结果。
using namespace std;
int main( ) {
cout << "开始" << endl;
try {
cout << "进入try块" << endl;
}
catch( int ) {
cout << "except of deviding zero.\n";
}
cout << "that is ok.\n"; } int Div( int x, int y ) {
if(y == 0)
程序运行结果如下: 5/2 = 2 except of deviding zero.
throw 999;
cout << "该语句不应执行";
}
catch( double i ) {
cout << "捕捉的异常为:";
cout << i << endl;
}
cout << "结束";
} 00:27
27/30
面向对象程序设计(C++描述)
布置作业(续)
3、编译运行以下代码,分析运行结果。
Expt( ) { }; ~Expt( ) { }; const char* ShowReason( ) const {
return "Expt类异常。"; } };
00:27
18/30
面向对象程序设计(C++描述)
class Demo { public:
Demo( ); ~Demo( ); }; Demo::Demo( ) { cout << "构造 Demo。" << endl; } Demo::~Demo( ) { cout << "析构 Demo。" << endl; }
} catch( char *str ) {
cout << "捕获到其它的异常:" << str << endl; } cout << "回到main函数。从这里恢复执行。"
<< endl; }
00:27
21/30
面向对象程序设计(C++描述)
程序运行时输出:
在main函数中。 在try块中,调用MyFunc( )。 构造 Demo. 在MyFunc( )中抛掷Expt类异常。 析构 Demo。 在catch异常处理程序中。 捕获到Expt类型异常:Expt类异常。 回到main函数。从这里恢复执行。
面向对象程序设计(C++描述)
异常处理
面向对象程序设计(C++描述)
本章主要内容
异常处理的基本思想
C++异常处理的实现
抛出异常throw 捕获异常try,catch
异常处理中的构造与析构 异常规格说明
00:27
2/30
面向对象程序设计(C++描述)
什么是异常?
应用程序要具有容错能力,当发生意外时也可作 出适当处理,不会导致严重后果。所谓异常,包 括用户误操作、外部设备或文件连接不正确、内 存不足等。
00:27
22/30
面向对象程序设计(C++描述)
异常接口声明
C + +语言提供了异常规格说明语法,我们可以利用它清 晰地告诉使用者函数抛出的异常的类型,这样使用者就 可方便地进行异常处理。这就是异常规格说明,它存在 于函数说明中,位于参数列表之后。
异常规格说明的三种形式: (1)指定异常,如: void f ( ) throw( toobig, toosmall, divzero); 函数f( )可抛出类型为toobig, toosmall, divzero的异常, 若函数体内抛出其它异常,调用函数无法捕获,系统将 调用abort函数终止程序。
cout << "在try块中,调用MyFunc( )。" << endl;
MyFunc( ); }
00:27
20/30
面向对象程序设计(C++描述)
catch( Expt E ) { cout << "在catch异常处理程序中。" << endl; cout << "捕获到Expt类型异常:"; cout << E.ShowReason( ) << endl;