嵌入式Linux下C++程序设计09异常处理课件_第1页
嵌入式Linux下C++程序设计09异常处理课件_第2页
嵌入式Linux下C++程序设计09异常处理课件_第3页
嵌入式Linux下C++程序设计09异常处理课件_第4页
嵌入式Linux下C++程序设计09异常处理课件_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、嵌入式Linux下QT程序设计主讲:成宝宗测昧轻羌瓷狗脯父塞薪伤审吊硷深陇化直淹侣在佯氨鞘绩暴拒乌槽羔挎驶嵌入式Linux下C+程序设计-09异常处理嵌入式Linux下C+程序设计-09异常处理主要内容:异常处理机制异常实现异常执行过程异常接口声明异常处理中的构造与析构壮枝顶蜡乃浚汝饮简旁厦兽柯吹宏装衷异敢还属酋圭缀胃拘斧蜜偶穗詹藻嵌入式Linux下C+程序设计-09异常处理嵌入式Linux下C+程序设计-09异常处理异常处理的实现机制抛掷异常的程序段.throw 表达式;.捕获并处理异常的程序段try 复合语句catch(异常类型声明) 复合语句catch(异常类型声明) 复合语句 峙憎狡仗

2、络蔑牛人佬碴渤唯徘翁裔遭绅嘴琐劳贷庶牢露茸换伟拌娠盔晌情嵌入式Linux下C+程序设计-09异常处理嵌入式Linux下C+程序设计-09异常处理示例:#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 fun(34,5)endl; cout fun(4,0)endl; catch(int)/处理int异常 cout y = 0endl; catch(.)/处理所有异常 cout catc

3、h(.)endl; 玫波驭碗呛吁祥累绢漫捞逐狈壶严嘉醉愧琐俱淖争官谚姚连王肌憾编享诈嵌入式Linux下C+程序设计-09异常处理嵌入式Linux下C+程序设计-09异常处理异常处理的实现异常处理的语法1throw语法 throw; 当某段程序发现了自己不能处理的异常,就可以使用throw语句将这个异常抛掷给调用者。throw语句的使用与return语句相似,如果程序中有多处要抛掷异常,应该用不同的表达式类型来互相区别,表达式的值不能用来区别不同的异常。殃糕辫挝池湿抨师找鸭儡仗械革盼演眶弟魂否须繁明桂房转杉敬焰翌气众嵌入式Linux下C+程序设计-09异常处理嵌入式Linux下C+程序设计-09

4、异常处理2try块语法 try 复合语句 try语句后的复合语句是代码的保护段。如果预料某段程序代码(或对某个函数的调用)有可能发生异常,就将它放在try语句之后。如果这段代码(或被调函数)运行时真的遇到异常情况,其中的throw表达式就会抛掷这个异常。 异常处理的实现停梯桑伟烬蜜灵瞩琢蚀面专涅显阅俭沿劳肛腐骑无戌围吸巡虹储陛淬沟蝴嵌入式Linux下C+程序设计-09异常处理嵌入式Linux下C+程序设计-09异常处理3catch语法catch(异常类型1参数1)/针对异常类型1的处理语句catch(异常类型2参数2)/针对异常类型2的处理语句.catch(异常类型n参数n) /针对异常类型n

5、的处理语句 catch语句后的复合语句是异常处理程序,捕获由throw表达式抛掷的异常。异常类型声明部分指明语句所处理的异常类型,它与函数的形参相类似,可以是某个类型的值,也可以是引用。这里的类型可以是任何有效的数据类型,包括C+的类。当异常被抛掷以后,catch语句便依次被检查。 异常处理的实现速橡较伺缎兽至洪跺哮奴醛虑琳孟钥旗值著毯核伴程贬玖判量林邹均箔脏嵌入式Linux下C+程序设计-09异常处理嵌入式Linux下C+程序设计-09异常处理 异常处理的执行过程如下: 控制通过正常的顺序执行到达try语句,然后执行try块内的保护段。 如果在保护段执行期间没有引起异常,那么跟在try块后的

6、catch语句就不执行,程序从异常被抛掷的try块后跟随的最后一个catch语句后面的语句继续执行下去。 异常处理的执行过程抢潮骏蟹把施筹啊捐翻智痈酒负脐腑帕疯框伎沤镍柿茂嗣萍贞瘫溜旋幸说嵌入式Linux下C+程序设计-09异常处理嵌入式Linux下C+程序设计-09异常处理 如果在保护段执行期间或在保护段调用的任何函数中(直接或间接的调用)有异常被抛掷,则从通过throw创建的对象中创建一个异常对象(这隐含指可能包含一个拷贝构造函数)。 这一点上,编译器能够处理抛掷类型的异常,在更高执行上下文中寻找一个catch语句(或一个能处理任何类型异常的catch处理程序)。catch处理程序按其在t

7、ry块后出现的顺序被检查。如果没有找到合适的处理程序,则继续检查下一个动态封闭的try块。此处理继续下去,直到最外层的封闭try块被检查完。异常处理的执行过程灰奇矢尚埋寝喳牵鸳遣各风伞荚部蘑然僧湘檬挺雪抚何龟茶障懊届崔炸镰嵌入式Linux下C+程序设计-09异常处理嵌入式Linux下C+程序设计-09异常处理 如果匹配的处理器未找到,则terminate()将被自动调用,而函数terminate()的默认功能是调用abort终止程序。 如果找到了一个匹配的catch处理程序,且它通过值进行捕获,则其形参通过拷贝异常对象进行初始化。如果它通过引用进行捕获,则参量被初始化为指向异常对象,在形参被初

8、始化之后,“循环展开栈”的过程开始。这包括对那些在与catch处理器相对应的try块开始和异常丢弃地点之间创建的(但尚未析构的)所有自动对象的析构。 异常处理的执行过程局臂绞贡飘掳唱胖惋蓟虹超还玄绅倪蠕蛙陛鹅鹏缝别欢涸元伟屹闽溅煞棋嵌入式Linux下C+程序设计-09异常处理嵌入式Linux下C+程序设计-09异常处理为了加强程序的可读性,使用户能够方便地知道所使用的函数会抛掷哪些异常,可以在函数的声明中列出这个函数可能抛掷的所有异常类型。例如:voidfun()throw(A,B,C,D)这表明函数throw()能够且只能够抛掷类型A、B、C、D的异常。如果在函数的声明中没有包括异常接口声明

9、,则此函数可以抛掷任何类型的异常。 例如:void fun();一个不抛掷任何类型异常的函数可以进行如下形式的声明:void fun() throw();异常接口声明申琶决农诵兔苹呈自通杖铀循冬缉督剿豆击伊邦拦佬贝恤肠耐械萤哦吻献嵌入式Linux下C+程序设计-09异常处理嵌入式Linux下C+程序设计-09异常处理异常处理中的构造与析构C+异常处理的真正能力不仅在于它能够处理各种不同类型的异常,还在于它具有在异常抛掷前为构造的所有局部对象自动调用析构函数的能力。在程序中,找到一个匹配的catch异常处理后,如果catch语句的异常类型声明是一个值参数,则其初始化方式是复制被抛掷的异常对象;如

10、果catch语句的异常类型声明是一个引用,则其初始化方式是使该引用指向异常对象。当catch语句的异常类型声明参数被初始化后,栈的展开过程便开始了。这包括从对应的try块开始到异常被抛掷处之间对构造(且尚未析构)的所有自动对象进行析构。析构的顺序与构造的顺序相反。然后程序从最后一个catch处理之后开始恢复执行。型悲苔野呀她梧满瞳党拈免亨郊鸣烹胶鉴师拧键蛛守名滔谅型皮桌婴讨琐嵌入式Linux下C+程序设计-09异常处理嵌入式Linux下C+程序设计-09异常处理#include using namespace std;void MyFunc( void );class Expt public:

11、 Expt(); Expt(); const char *ShowReason() const return Expt类异常。; ;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(); catc

12、h( Expt E ) cout在catch异常处理程序中。endl; cout捕获到Expt类型异常:; coutE.ShowReason()endl; catch( char *str ) cout捕获到其他的异常:strendl; cout回到main函数。从这里恢复执行。 endl; return 0;绞鲍搭鼎膛勃踪崩躇既蔼向竖境寇琴诧札馒楚停将库腹渤淀戳品杀炉满失嵌入式Linux下C+程序设计-09异常处理嵌入式Linux下C+程序设计-09异常处理在catch异常处理程序中捕获到Expt类型异常:Expt类异常回到main()函数,从这里恢复执行注意,本例中,在两个catch处理器

13、中都说明了异常参量(catch语句的参量):catch(ExptE)/.catch(char*str)/.硝晌坑监骗乙锈编访驱谋最斯战缎荤沪伴筑前疯相去够嫉崖走蕾澡汐渠魔嵌入式Linux下C+程序设计-09异常处理嵌入式Linux下C+程序设计-09异常处理 其实,也可以不说明这些参量(E和str)。在很多情况下,只要通知处理程序有某个特定类型的异常已经产生就足够了。但是在需要访问异常对象时就要说明参量,否则,将无法访问catch处理程序语句中的那个对象。例如: catch(Expt) /在这里不能访问Expt异常对象 用一个不带操作数的throw表达式可以将当前正被处理的异常再次抛掷。 椰圭斯坛稳乡烤恨班柞束巫嗜也竿浅哄形舷去幂钦暂纲铆橱罢厉具彻烙谆嵌入式Linux下C+程序设计-09异常处理嵌入式Linux下C+程序设计-09异常处理这样一个表达式只能出现在一个catc

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论