C++ 第十章 异常处理

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

抛出任意类型异常
– 类型 函数名( 参数列表 )
面向对象程序设计 内蒙古工业大学 8
异常处理中的构造与析构
异常处理中的构造与析构
找到一个匹配的catch异常处理后:
初始化参数(两种情况) 将从对应的try块开始到异常被抛掷处之间构造 (且尚未析构)的,所有自动对象进行析构 从最后一个catch处理之后开始恢复执行。
异常处理语法
抛掷异常的程序段 ...... throw ...... try 表达式; 复合语句 如果预料某段程 序可能发生异常 捕获并处理异常的程序段
catch(异常类型声明)
复合语句 catch(异常类型声明)
将异常抛给调用者
复合语句
… 异常处理程序,捕获由 throw抛出的异常。
面向对象程序设计
面向对象程序设计
内蒙古工业大学
9
异常处理中的构造与析构
异常处理中的构造与析构
#include <iostream.h> void MyFunc( void ); class Expt { public: Expt(){}; ~Expt(){}; const char *ShowReason( ) const {
面向对象程序设计 内蒙古工业大学 11
异常处理中的构造与析构
异常处理中的构造与析构
void MyFunc() { Demo D; cout<<"在MyFunc()中抛掷Expt类异常。"<<endl; throw Expt(); } int main() { cout<<"在main函数中。"<<endl; try { cout<<"在try块中,调用MyFunc()。" <<endl; MyFunc(); }
return "Expt类异常。";
} };
面向对象程序设计 内蒙古工业大学 10
异常处理中的构造与析构
异常处理中的构造与析构
class Demo { public: Demo(); ~Demo(); }; Demo::Demo() { cout<<"构造 Demo."<<endl; } Demo::~Demo() { cout<<"析构 Demo."<<endl; }
面向对象程序设计
内蒙古工业大学
6
C++异常处理的实现
除零异常
#include<iostream.h> int Div( int x,int y ) { if(y==0) throw y; return x/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 ) { cout<<"except of deviding zero.\n"; catch( ... ) { } cout<<"that is ok.\n"; }
第十章 异常处理
基本思想
C++异常处理的实现
异常处理中的构造与析构
标准程序库异常处理
面向对象程序设计
内蒙古工业大学
1
基本思想
异常处理的基本思想
调用者 函数f()捕获并处理异常
调用关系
……
wk.baidu.com
异常传播方向
函数g()
函数h() 引发异常
面向对象程序设计 内蒙古工业大学 2
C++异常处理的实现
面向对象程序设计 内蒙古工业大学
}
7
C++异常处理的实现
异常接口的声明
为了便于阅读,使得用户在看程序时就知道所 用函数是否会抛出异常,可在声明时列出
指定异常
– 类型 函数名( 参数列表 ) throw (T1,T2,…Tn);
不抛出异常
– 类型 函数名( 参数列表 ) throw( )
面向对象程序设计 内蒙古工业大学 5
C++异常处理的实现
异常处理的执行过程
catch子句按其在try块后出现的顺序被检查。 匹配的catch子句将捕获并处理异常(或继续 抛掷异常)。
如果匹配的处理器未找到,则运行函数 terminate将被自动调用,其缺省功能是调用 abort终止程序。
面向对象程序设计 内蒙古工业大学 4
C++异常处理的实现
异常处理的执行过程
若有异常则通过throw操作创建一个异常对象 并抛掷。 将可能抛出异常的程序段嵌在try块之中。控 制通过正常的顺序执行到达try语句,然后执 行try块内的保护段。 如果在保护段执行期间没有引起异常,那么 跟在try块后的catch子句就不执行。程序从 try块后跟随的最后一个catch子句后面的语句 继续执行下去。
面向对象程序设计 内蒙古工业大学 12
异常处理中的构造与析构
异常处理中的构造与析构
catch( Expt E ) { cout<<"在catch异常处理程序中。"<<endl; cout<<"捕获到Expt类型异常:"; cout<<E.ShowReason()<<endl; } catch( char *str ) { cout<<"捕获到其它的异常:"<<str<<endl; } cout<<"回到main函数。从这里恢复执行。" <<endl; return 0;
内蒙古工业大学
3
C++异常处理的实现
异常处理的语法
被检测的函数必须放在try中。
在try-catch中可只有try块而没有catch块, 但catch不能单独使用。 try-catch中的花括号不能省略。 try-catch中只能有一个try块,可有多个
catch块。
catch中一般只写异常信息的类型名 catch(…)表示捕获所有类型的异常
}
面向对象程序设计 内蒙古工业大学 13
异常处理中的构造与析构
异常处理中的构造与析构
面向对象程序设计
内蒙古工业大学
14
相关文档
最新文档