《C++面向对象程序设计 教学课件 ppt 作者 朱战立 张玉祥 C++8》由会员分享,可在线阅读,更多相关《C++面向对象程序设计 教学课件 ppt 作者 朱战立 张玉祥 C++8(21页珍藏版)》请在金锄头文库上搜索。
1、第八章 异常处理,异常类 抛出异常throw 捕捉异常try,异常,定义 程序在执行过程中出现的意外情况。 分类 用户输入错误 设备故障 物理限制 代码错误,传统异常处理方法,方法 条件判断、分支处理 问题 程序错误影响整个系统的运行。最好是停止发生 错误的局部操作,进行必要处理。其他部分仍然 继续运行。,Complex Complex:Divide(const Complex x)const Complex Z; float c=x.real*x.real+x.imag*x.imag; if ( C=0) cout“分母为0错!”; exit(0); else z.real=(real*x.
2、real+imag*x.imag)/c; z.imag=(x.real*imag real* x.imag)/c; return z; ,C+异常处理方法,基本思想 分离异常的抛出和异常的处理。 基本方法 当程序中出现异常时抛出异常,通知系统发生了 异常,然后由系统捕捉异常,并交给预先安排的 异常处理程序段来处理异常。 优点 方便通用软件模块的设计。,基本的异常处理方法,/complex.h #include class DivideZero ; class Complex Complex Divide(const Complex x)const; ; Complex Complex:Divi
3、de(const Complex x) const float c=x.real*x.real+x.imag*x.imag; if ( C=0) throw DivideZero(); return Compelx( real*x.real + imag*x.imag)/c, x.real*imag real* x.imag)/c); ,程序中所有可能异常,义相应的异常类,常为空。,throw异常类对象 调用类的构造函数创 建异常类对象,系统自动创建一个DivdeZero类的无名对象,/Exam8-1.cpp #include”Complex.h” void main(void) Comple
4、x x(1,1), y(0,0),z; try z=x.Divide(y); cout “z is: ” ; z.show(); catch(DivideZero) cout “除数为0错!” endl; ,系统捕捉try圈定程序中异常的发生:发生,则中断程序执行;否则,顺序执行模块中语句。,catch() /异常处理语句 含返回语句,则整个程序结束; 否则,顺序执行catch语句后的语句。,多个异常的处理方法,try /可能抛出异常的语句段; catch( ) /异常类1处理语句 catch( ) /异常类n处理语句 ,例8.2 顺序堆栈类异常处理,异常类的定义和异常抛出 入栈满异常类 出栈
5、空异常类 测试程序捕捉异常,异常类的设计,class PushOnFull /入栈满异常类 private: int value; /成员变量 public: PushOnFull(int x): value(x) /构造函数 int Value(void) /取value值成员函数 return value; ; class PopOnEmpty /出栈空异常类 ;,异常类的设计,class SeqStack /顺序堆栈类 private: int *data; /数组 int MaxStackSize; /数组个数 int top; /当前栈顶下标 public: SeqStack(int
6、 n); /构造函数 SeqStack(void); /析构函数 void Push(const int item); /入栈 int Pop(void); /出栈 ;,异常类的设计,SeqStack:SeqStack(int n) /构造函数 top = 0; MaxStackSize = n; data = new intn; SeqStack:SeqStack(void) /析构函数 delete data; ,异常类的设计,void SeqStack:Push(const int item) /入栈 if(top = MaxStackSize) throw PushOnFull(ite
7、m); datatop = item; top+; int SeqStack:Pop() /出栈 if(top = 0) throw PopOnEmpty(); /抛出异常 top-; return datatop; ,异常类的设计,#include #include “SeqStack2.h“ void main(void) int i; SeqStack myStack(10); try /捕捉异常1 for(i = 0; i 11; i+) myStack.Push(i+1); catch(PushOnFull obj) /处理异常1 cout “堆栈已满“ endl; cout “当前
8、要入栈的元素为:“ obj.Value(); ,异常类的设计,try /捕捉异常2 for(i = 0; i 11; i+) cout myStack.Pop() “ “; catch(PopOnEmpty) /处理异常2 cout “堆栈已空“ endl; ,异常抛出和处理的两种方式,异常的抛出和处理有两种方式: (1)在同一个函数中抛出异常和处理异常 (2)在一个函数中抛出异常,在调用该函数的函数中处理异常。 见前面的复数类和测试函数 以及顺序堆栈类和测试函数,异常抛出和处理第一种方式,class PushOnFull /入栈满异常类 ; class PopOnEmpty /出栈空异常类
9、; class SeqStack /顺序堆栈类 private: int *data; /数组 int MaxStackSize; /数组个数 int top; /当前栈顶下标 public: SeqStack(int n); /构造函数 SeqStack(void); /析构函数 void Push(const int item); /入栈 int Pop(void); /出栈 ;,异常抛出和处理第一种方式,class PushOnFull /入栈满异常类 ; class PopOnEmpty /出栈空异常类 ; class SeqStack /顺序堆栈类 private: int *dat
10、a; /数组 int MaxStackSize; /数组个数 int top; /当前栈顶下标 public: SeqStack(int n); /构造函数 SeqStack(void); /析构函数 void Push(const int item); /入栈 int Pop(void); /出栈 ;,异常抛出和处理第一种方式,int SeqStack:Pop() /出栈 try /捕捉异常 if(top = 0) throw PopOnEmpty();/抛出异常 top-; return datatop; catch(PopOnEmpty) /处理异常 cout “堆栈已空“ endl;
11、return -1; ,异常抛出和处理第一种方式,#include #include “SeqStack3.h“ void main(void) int i; SeqStack myStack(10); for(i = 0; i 11; i+) myStack.Push(i+1); for(i = 0; i 11; i+) cout myStack.Pop() “ “; ,作业,习题7.2,7.3, 7.4,7.6 ,7.7 习题8.2,8.4,8.5,8.7 上机作业题 设计一个分数类。要求: (1)分数类模板中包含的分数运算有:两个分数的加、除运算 。 (2)分数的输出格式是:分子/分母。 (3)设计成分数类模板。 (4)设计成包含除运算的异常处理 。,