嵌入式linux下c++程序设计--09异常处理

上传人:kms****20 文档编号:51683700 上传时间:2018-08-15 格式:PPT 页数:16 大小:1.10MB
返回 下载 相关 举报
嵌入式linux下c++程序设计--09异常处理_第1页
第1页 / 共16页
嵌入式linux下c++程序设计--09异常处理_第2页
第2页 / 共16页
嵌入式linux下c++程序设计--09异常处理_第3页
第3页 / 共16页
嵌入式linux下c++程序设计--09异常处理_第4页
第4页 / 共16页
嵌入式linux下c++程序设计--09异常处理_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《嵌入式linux下c++程序设计--09异常处理》由会员分享,可在线阅读,更多相关《嵌入式linux下c++程序设计--09异常处理(16页珍藏版)》请在金锄头文库上搜索。

1、嵌入式Linux下QT程序设计主讲:成宝宗主要内容:异常处理机制 异常实现 异常执行过程 异常接口声明 异常处理中的构造与析构异常处理的实现 机制抛掷异常的程序段throw 表达式;捕获并处理异常的程序段 try复合语句 catch(异常类型声明)复合语句 catch(异常类型声明)复合语句示例:#include using namespace std; int fun(int x, int y)/抛出异常 if (y = 0)throw y; return x/y; int main(int argc, char *argv) try/捕获异常 cout ; 当某段程序发现 了自己不能处理的

2、异常,就可以 使用throw语句将这个异常抛掷给调 用者。throw 语句的使用与return语句相似,如果程序中有多处 要抛掷异常,应该 用不同的表达式类型来互相区 别,表达式的值不能用来区别不同的异常。2try块语 法 try 复合语句 try语句后的复合语句是代码的保护段。如果预 料某段程序代码(或对某个函数的调用)有可能发生 异常,就将它放在try语句之后。如果这段代码(或 被调函数)运行时真的遇到异常情况,其中的 throw表达式就会抛掷这 个异常。 异常处理的实现3catch语法catch(异常类型1参数1)/针对异常类型1的处理语句catch(异常类型2参数2)/针对异常类型2的

3、处理语句.catch(异常类型n参数n) /针对异常类型n的处理语句 catch语句后的复合语句是异常处理程序,捕获由throw表达式抛掷的异常。异常类型声明部分指明 语句所处理的异常类型,它与函数的形参相类似,可以是某个类型的值,也可以是引用。这里的类 型可以是任何有效的数据类型,包括C+的类。当异常被抛掷以后,catch语句便依次被检查。 异常处理的实现 异常处理的执行过程如下: 控制通过正常的顺序执行到达try语句,然后执行 try块内的保护段。 如果在保护段执行期间没有引起异常,那么跟在 try块后的catch语句就不执行,程序从异常被抛掷的 try块后跟随的最后一个catch语句后面

4、的语句继续执 行下去。 异常处理的执行过程 如果在保护段执行期间或在保护段调用的任 何函数中(直接或间接的调用)有异常被抛掷,则从 通过throw创建的对象中创建一个异常对象(这隐 含指可能包含一个拷贝构造函数)。 这一点上,编译 器能够处 理抛掷类 型的异常,在 更高执行上下文中寻找一个catch语句(或一个能处 理任何类型异常的catch处理程序)。catch处理程 序按其在try块后出现的顺序被检查 。如果没有找 到合适的处理程序,则继续检查 下一个动态 封闭 的try块。此处理继续 下去,直到最外层的封闭try 块被检查 完。异常处理的执行过程 如果匹配的处理器未找到,则termina

5、te()将被 自动调 用,而函数terminate()的默认功能是调用 abort终止程序。 如果找到了一个匹配的catch处理程序,且它通 过值进 行捕获,则其形参通过拷贝异常对象进行 初始化。如果它通过引用进行捕获,则参量被初 始化为指向异常对象,在形参被初始化之后,“循 环展开栈”的过程开始。这包括对那些在与catch 处理器相对应 的try块开始和异常丢弃地点之间创 建的(但尚未析构的)所有自动对 象的析构。 异常处理的执行过程为了加强程序的可读性,使用户能够方便地知道所使用的 函数会抛掷哪些异常,可以在函数的声明中列出这个函数 可能抛掷的所有异常类型。例如: voidfun()thr

6、ow(A,B,C,D) 这表明函数throw()能够且只能够抛掷类 型A、B、C、D的 异常。 如果在函数的声明中没有包括异常接口声明,则此函数可以 抛掷任何类型的异常。 例如:void fun();一个不抛掷任何类型异常的函数可以进行如下形式的声明:void fun() throw();异常接口声明异常处理中的构造与析构C+异常处理的真正能力不仅在于它能够处 理各种不同类型的 异常,还在于它具有在异常抛掷前为构造的所有局部对象自动 调用析构函数的能力。 在程序中,找到一个匹配的catch异常处理后,如果catch语句 的异常类型声明是一个值参数,则其初始化方式是复制被抛掷 的异常对象;如果c

7、atch语句的异常类型声明是一个引用,则其 初始化方式是使该引用指向异常对象。当catch语句的异常类型声明参数被初始化后,栈的展开过程便 开始了。这包括从对应 的try块开始到异常被抛掷处 之间对 构 造(且尚未析构)的所有自动对 象进行析构。析构的顺序与构造 的顺序相反。然后程序从最后一个catch处理之后开始恢复执行 。#include using namespace std; void MyFunc( void ); class Expt public: Expt(); Expt(); const char *ShowReason() const return “Expt类异常。“;

8、; class Demo public: Demo(); Demo(); ; Demo:Demo() cout“构造 Demo.“endl; Demo:Demo() cout“析构 Demo.“endl; void MyFunc() Demo D; cout“在MyFunc()中抛掷Expt类异常。 “endl; throw Expt(); int main() cout“在main函数中。“endl; try cout“在try块中,调用MyFunc()。“ endl; MyFunc(); catch( Expt E ) cout“在catch异常处理程序中。“endl; cout“捕获到E

9、xpt类型异常:“; coutE.ShowReason()endl; catch( char *str ) cout“捕获到其他的异常:“strendl; cout“回到main函数。从这里恢复执行。“ endl; return 0; 在catch异常处理程序中 捕获到Expt类型异常:Expt类异常 回到main()函数,从这里恢复执行 注意,本例中,在两个catch处理器中都说明了异 常参量(catch语句的参量): catch(ExptE) /. catch(char*str) /. 其实,也可以不说明这些参量(E和str)。在很多情况下,只 要通知处理程序有某个特定类型的异常已经产 生就足够了。但是 在需要访问 异常对象时就要说明参量,否则,将无法访问 catch 处理程序语句中的那个对象。例如: catch(Expt) /在这里不能访问 Expt异常对象 用一个不带操作数的throw表达式可以将当前正被处理的异 常再次抛掷。 这样 一个表达式只能出现在一个catch处理程序中或catch处 理程序内部调用的函数中。再次抛掷的异常对象是源异常 对象(不是拷贝)。例如: try throwCSomeOtherException(); catch(.)/处理所有异常 /对异常作出响应(也许仅仅 是部分的) /. throw;/将异常传给 某个其它处理器

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号