C++语言程序设计 第十二章异常处理 清华大学计算机与信息管理中心 郑莉
第十二章 异常处理 清华大学计算机与信息管理中心 郑 莉 C++语言程序设计
本章主要内率 ●异常处理的基本思想 C++异常处理的实现 异常处理中的构造与析构 休息
前一页 休息 本章主要内容 ⚫ 异常处理的基本思想 ⚫ C++异常处理的实现 ⚫ 异常处理中的构造与析构
异常处理的基本思想 调用者 函数fO捕获并处理异常 调用关系 异常传播方向 函数g( 函数h(引发异常 休息
前一页 休息 异常处理的基本思想 函数f()捕获并处理异常 函数h() 引发异常 函数g() …… 调用者 调用关系 异常传播方向
异常处理的奥现 catch子旬按其在ty‖若有异常则从通过 块后出现的顺序被检 throw操作创建一个 查。匹配的 catch子句 异常对象并抛掷 将捕获并处理异常 (或继续抛掷异常) 如果匹配的处理器未 找到,则运行函数 terminate将被自动调 用,其缺省功能是调 用abor终止程序
前一页 休息 异常处理的实现 ⚫ 抛掷异常的程序段 ...... throw 表达式; ...... ⚫ 捕获并处理异常的 程序段 try 复合语句 catch(异常类型声明) 复合语句 catch(异常类型声明) 复合语句 … • 控制通过正常的顺 序执行到达try语句, 然后执行try块内的 保护段。 • 如果在保护段执行 期间没有引起异常, 那么跟在try块后的 catch子句就不执行。 程序从try块后跟随 的最后一个catch子 句后面的语句继续 执行下去。 • 若有异常则从通过 throw操作创建一个 异常对象并抛掷。 •catch子句按其在try 块后出现的顺序被检 查。匹配的catch子句 将捕获并处理异常 (或继续抛掷异常)。 •如果匹配的处理器未 找到,则运行函数 terminate将被自动调 用,其缺省功能是调 用abort终止程序
例12-1处理除零异常 include int Div(int x, int y) void main( I try I cout<< 5/ 2=<<Div(5, 2)<<endl; cout<<"80=≤<Div(8,0)≤≤endl cout<< 711=<<Div(7, 1)<<endl; 休息
前一页 休息 例12-1处理除零异常 #include int Div(int x,int y); void 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) i cout<< except of deviding zero. In", cout<< that is ok,n int Div(int x, int y) if(y==0) 程序运行结果如下: throw y; 5/2=2 return xly except of deviding zero. that is ok
catch(int) { cout<<"except of deviding zero.\n"; } cout<<"that is ok.\n"; } int Div(int x,int y) { if(y==0) throw y; return x/y; } 程序运行结果如下: 5/2=2 except of deviding zero. that is ok
异常接口声明 可以在函数的声明中列出这个函数可 能抛掷的所有异常类型。 例如: void funo throw(A, B, C 若无异常接口声明,则此函数可以抛 掷任何类型的异常 ●不抛掷任何类型异常的函数声明如下 void fun( throw 休息
前一页 休息 异常接口声明 ⚫ 可以在函数的声明中列出这个函数可 能抛掷的所有异常类型。 – 例如: void fun() throw(A,B,C,D); ⚫ 若无异常接口声明,则此函数可以抛 掷任何类型的异常。 ⚫ 不抛掷任何类型异常的函数声明如下: void fun() throw();
异常处理中的构造与析构 找到一个匹配的 catch异常处理后: 初始化参数。 将从对应的ty块开始到异常被抛掷 处之间构造(且尚未析构)的,所 有自动对象进行析构。 从最后一个 catch处理之后开始恢复 执行。 休息
前一页 休息 异常处理中的构造与析构 ⚫ 找到一个匹配的catch异常处理后: –初始化参数。 –将从对应的try块开始到异常被抛掷 处之间构造(且尚未析构)的,所 有自动对象进行析构。 –从最后一个catch处理之后开始恢复 执行
例12-2异常处理时的析构 include void My Func( void ) class Expt i public: Exprot: Expt(f; const char*ShowReason( const return"Expt类异常。"; 了一页休息
前一页 休息 例12-2 异常处理时的析构 #include void MyFunc( void ); class Expt { public: Expt(){}; ~Expt(){}; const char *ShowReason() const { return "Expt类异常。"; } };
class demo i public: Demod: cDemo( Demo: Demo cout<<"构造Demo."<<endl; Demo: : -Demo cout<<"析构Demo."<<endl
class Demo { public: Demo(); ~Demo(); }; Demo::Demo() { cout << "构造 Demo." << endl; } Demo::~Demo() { cout << "析构 Demo." << endl; }