当前位置:文档之家› 第12章+异常处理.

第12章+异常处理.

传统的处理方法是使用中断指令,如abort, assert, exit, return, 错误处理代码掺杂于功能实现代码, 降低了程序的可读性和可维护性, 而且不适合于 代码重用。
c++的异常处理允许程序以结构化和顺序化的方 式处理反常和意外的情况。
00:27
3/30
面向对象程序设计(C++描述)
找到一个匹配的catch异常处理后: 初始化参数。 将从对应的try块开始到异常被抛掷 处之间构造(且尚未析构)的,所 有自动对象进行析构。 从最后一个catch处理之后开始恢复 执行。
00:27
17/30
面向对象程序设计(C++描述)
例2 异常处理时的析构(重点掌握)
#include <iostream> void MyFunc( void ); class Expt { //自编的异常处理类 public:
throw y;
that is ok.
return x / y;
}00:27
10/30
面向对象程序设计(C++描述)
异常的重新抛出
如果异常处理程序捕获到异常后,无法确定异常的 处理方式,须再抛出传递。这些工作通过加入不带 参数的throw就可完成: catch( . . . ) { cout << "an exception was thrown " << endl; throw; }
} cout << "结束"; }
00:27
26/30
面向对象程序设计(C++描述)
布置作业(续)
2、分析以下代码,写出运行结果,并与题1对比分析运行结果。
using namespace std;
int main( ) {
cout << "开始" << endl;
try {
cout << "进入try块" << endl;
异常处理的基本思想
将异常检测与处理分离,出现异常的函数不需 具备处理异常的能力。
当一个函数发生异常时,它抛出一个异常,调 用者捕获并处理该异常。若调用者不能处理, 还可抛出给上一级调用者处理,直至运行系统。 若仍不能处理,将简单终止程序。
00:27
4/30
面向对象程序设计(C++描述)
异常处理的基本思想
00:27
29/30
面向对象程序设计(C++描述)
布置作业(续)
5、练习使用try、catch语句,在程序中用new分配内 存时,如果操作未成功,则用try语句触发一个char类 型异常,用catch语句捕获此异常。声明char *ptr[10];, 为该数组的每个元素分配1000000000字节的内存。 6(思考题,选做)、编写一个简单的异常处理类 CDivideByZeroException,其中提供异常处理信息。 在主函数中用try检测除数为0的异常情况,然后在除法 运算函数quotient()中用throw抛出异常,最后用catch 捕捉并处理除数为0的异常。
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"; } int Div( int x, int y ) {
if(y == 0)
程序运行结果如下: 5/2 = 2 except of deviding zero.
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";
7/30
面向对象程序设计(C++描述)
异常处理语法(抛出异常)
try 块 try { // 需保护的测试块 }
throw语句 throw 表达式;
// 表达式可以是任意类型的对象 // throw语句必须在try块、catch块或其调用的函数中执行
ห้องสมุดไป่ตู้00:27
8/30
面向对象程序设计(C++描述)
1 异常处理的基本思想
2 C++异常处理的实现
3 异常处理中的构造与析构
4 异常规格说明
5 异常是错误的事件或运行期间发生的反常,有两种类型:
同步异常,在运行期间产生并可使用throw抛出
异步异常,由硬件或运行环境引起的异步错误
6 异常处理是c++一个特性,它支持以一种标准的方式处理 错误,即通过关键字throw, try, catch实现。
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; } }
cout << "在try块中,调用MyFunc( )。" << endl;
MyFunc( ); }
00:27
20/30
面向对象程序设计(C++描述)
catch( Expt E ) { cout << "在catch异常处理程序中。" << endl; cout << "捕获到Expt类型异常:"; cout << E.ShowReason( ) << endl;
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块 catch ( 类型 参数) //类型为基本数据类型或类类型 { // 异常处理语句块 } catch( … ) // 可捕获处理任意类型的异常 { // 异常处理语句块 }
00:27
9/30
例1 处理除零异常 面向对象程序设计(C++描述)
#include <iostream>
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
19/30
面向对象程序设计(C++描述)
void MyFunc( ) { Demo D; cout << "在MyFunc( )中抛掷Expt类异常。" << endl; throw Expt( ); //构建异常对象,并抛出
} int main( ) {
cout << "在main函数中。" << endl; try {
面向对象程序设计(C++描述)
异常处理
面向对象程序设计(C++描述)
本章主要内容
异常处理的基本思想
C++异常处理的实现
抛出异常throw 捕获异常try,catch
相关主题