欢迎来到天天文库
浏览记录
ID:38304686
大小:1.10 MB
页数:16页
时间:2019-06-08
《嵌入式Linux下C+程序设计-09异常处理》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、嵌入式Linux下QT程序设计主讲:成宝宗主要内容:异常处理机制异常实现异常执行过程异常接口声明异常处理中的构造与析构异常处理的实现机制抛掷异常的程序段......throw表达式;......捕获并处理异常的程序段try复合语句catch(异常类型声明)复合语句catch(异常类型声明)复合语句…示例:#includeusingnamespacestd;intfun(intx,inty){//抛出异常if(y==0)throwy;returnx/y;}intmain(intargc,char*argv[]){try{//捕获异常co
2、ut<;当某段程序发现了自己不能处理的异常,就可以使用throw语句将这个异常抛掷给调用者。throw语句的使用与return语句相似,如果程序中有多处要抛掷异常,应该用不同的表达式类型来互相区别,表达式的值不能用来区别不同的异常。2.try块
3、语法try{复合语句}try语句后的复合语句是代码的保护段。如果预料某段程序代码(或对某个函数的调用)有可能发生异常,就将它放在try语句之后。如果这段代码(或被调函数)运行时真的遇到异常情况,其中的throw表达式就会抛掷这个异常。异常处理的实现3.catch语法catch(异常类型1参数1){//针对异常类型1的处理语句}catch(异常类型2参数2){//针对异常类型2的处理语句}...catch(异常类型n参数n){//针对异常类型n的处理语句}catch语句后的复合语句是异常处理程序,捕获由throw表达式抛掷的异常。异常类型声明部分指明语句所
4、处理的异常类型,它与函数的形参相类似,可以是某个类型的值,也可以是引用。这里的类型可以是任何有效的数据类型,包括C++的类。当异常被抛掷以后,catch语句便依次被检查。异常处理的实现异常处理的执行过程如下:①控制通过正常的顺序执行到达try语句,然后执行try块内的保护段。②如果在保护段执行期间没有引起异常,那么跟在try块后的catch语句就不执行,程序从异常被抛掷的try块后跟随的最后一个catch语句后面的语句继续执行下去。异常处理的执行过程③如果在保护段执行期间或在保护段调用的任何函数中(直接或间接的调用)有异常被抛掷,则从通过throw创建的
5、对象中创建一个异常对象(这隐含指可能包含一个拷贝构造函数)。这一点上,编译器能够处理抛掷类型的异常,在更高执行上下文中寻找一个catch语句(或一个能处理任何类型异常的catch处理程序)。catch处理程序按其在try块后出现的顺序被检查。如果没有找到合适的处理程序,则继续检查下一个动态封闭的try块。此处理继续下去,直到最外层的封闭try块被检查完。异常处理的执行过程④如果匹配的处理器未找到,则terminate()将被自动调用,而函数terminate()的默认功能是调用abort终止程序。⑤如果找到了一个匹配的catch处理程序,且它通过值进行捕
6、获,则其形参通过拷贝异常对象进行初始化。如果它通过引用进行捕获,则参量被初始化为指向异常对象,在形参被初始化之后,“循环展开栈”的过程开始。这包括对那些在与catch处理器相对应的try块开始和异常丢弃地点之间创建的(但尚未析构的)所有自动对象的析构。异常处理的执行过程为了加强程序的可读性,使用户能够方便地知道所使用的函数会抛掷哪些异常,可以在函数的声明中列出这个函数可能抛掷的所有异常类型。例如:voidfun()throw(A,B,C,D)这表明函数throw()能够且只能够抛掷类型A、B、C、D的异常。如果在函数的声明中没有包括异常接口声明,则此函数
7、可以抛掷任何类型的异常。例如:voidfun();一个不抛掷任何类型异常的函数可以进行如下形式的声明:voidfun()throw();异常接口声明异常处理中的构造与析构C++异常处理的真正能力不仅在于它能够处理各种不同类型的异常,还在于它具有在异常抛掷前为构造的所有局部对象自动调用析构函数的能力。在程序中,找到一个匹配的catch异常处理后,如果catch语句的异常类型声明是一个值参数,则其初始化方式是复制被抛掷的异常对象;如果catch语句的异常类型声明是一个引用,则其初始化方式是使该引用指向异常对象。当catch语句的异常类型声明参数被初始化后,栈
8、的展开过程便开始了。这包括从对应的try块开始到异常被抛掷处之间对构造(且尚未析
此文档下载收益归作者所有