H面向对象(异常处理)YH.ppt
《H面向对象(异常处理)YH.ppt》由会员分享,可在线阅读,更多相关《H面向对象(异常处理)YH.ppt(52页珍藏版)》请在三一办公上搜索。
1、1-1,知识回顾,I/O流的概念输出流输入流,2,异常处理,第八章,1-3,理解异常处理的概念掌握异常处理的实现掌握异常处理中对象的构造与析构理解名字空间的概述,本章目标,异常处理是C+语言中重要的错误处理机制,是提高程序容错性的一种手段。异常处理主要针对程序运行时出现的各种异常情况,提供发现,捕获异常的手段,并尽量减少异常对程序运行的影响。,有的程序虽然经过编译、连接成为可以运行的程序,但在运行过程中难免会出现各种各样的问题,即使对那些所谓能“正常运行”的程序而言也是如此。,程序中潜在的异常问题,提出问题,示例:#include#include using namespace std;int
2、 main()float a,b,c;double x1,x2;couta;coutb;coutc;,x1=(-b+sqrt(b*b-4*a*c)/(2*a);x2=(-b-sqrt(b*b-4*a*c)/(2*a);cout方程的实根是:x1=x1endl;cout方程的实根是:x2=x2endl;return 0;,从上面例子可以看出:能够“正常运行”的程序可能存在着许多潜在的“隐患”。程序运行可以检测到的一些非正常情况称为异常(exception)。如除数为0、数组越界访问、内存空间不够、输入/输出不正常(文件找不到、输入数据类型错等)等。异常是程序错误一种形式。,分析问题,程序中的错误
3、按性质可分为语法错误、逻辑错误和异常3种。一般来说,异常的检测和处理要完成下列任务之一:(1)让“用户”知道程序出现了异常,并退出程序。(2)让“用户”知道程序出现了异常,允许“用户”选择继续使用程序。(3)在程序发生异常时,能够在不打扰“用户”的情况下继续程序的运行。,C+语言异常处理机制的基本思想是将异常的检测与处理分离。当在一个函数体中检测到异常条件存在,但无法确定相应的处理方法时,将引发一个异常,并由函数直接或间接调用检测并处理这个异常。这一基本思想用3个保留字实现:throw、try和catch。在一般情况下,被调用函数直接检测到异常条件的存在并使用throw引发一个异常(注意,C+
4、语言的异常是由程序员控制引发的,而不是由计算机硬件或程序运行环境控制的);在上层调用函数中使用try检测函数调用是否引发异常,检测到的各种异常由catch捕获并作相应处理。,异常处理实现,在VC+6.0环境中,为了使用异常处理机制,需要进行如下设置(默认设置):(1)选择菜单中的project。(2)在弹出的下拉菜单中选择Setting命令,出现Settings对话框。(3)打开C/C+选项卡。(4)在Category中选择 C+Language。(5)选中Enable exception handling复选框。,在C+程序中,任何需要检测异常的语句(包括函数调用)都必须在try语句块中执行
5、,异常必须由紧跟着try语句后面的catch语句来捕获并处理。因而,try与catch总是结合使用。,1、异常处理的语法,throw、try和catch语句的一般语法如下:throw 表达式;try/try语句块 catch(类型1 参数1)/针对类型1的异常处理 catch(类型2 参数2)/针对类型1的异常处理.catch(类型n 参数n)/针对类型1的异常处理,异常处理的执行过程如下:(1)控制通过正常的顺序执行到达try语句,然后执行try块内的保护段。(2)如果在保护段执行期间没有引起异常,那么跟在try块后的catch子句就不执行,程序从异常被抛掷的try块后跟随的最后一个catc
6、h子句后面的语句继续执行下去。(3)如果在保护段执行期间或在保护段调用的任何函数中(直接或间接的调用)有异常被抛掷,则从通过throw运算数创建的对象中创建一个异常对象(可能包含一个复制构造函数)。(4)如果匹配的处理器未找到,则运行函数terminate将被自动调用,而函数terminate的默认功能是调用abort终止程序。(5)如果找到了一个匹配的catch处理程序,且它通过值进行捕获,则其形参通过复制异常对象进行初始化。,示例1:#include void main()char*buf;trybuf=new char512;if(buf=0)throw 内存分配错误!;cout内存分配
7、成功!endl;catch(char*str)cout异常引发:strendl;,示例2:#include int fun(int);void main()trycout4!=fun(4)endl;cout-2!=fun(-2)endl;cout5!=fun(5);catch(int n)coutn=n不能计算n!endl;cout程序执行结束.endl;,int fun(int n)if(n=0)throw n;int s=1;for(int i=1;i=n;i+)s*=i;return s;catch处理程序的出现次序很重要,因为在一个try块中,异常处理程序是按照它出现的次序检查的。只要
8、找到一个匹配的异常类型,后面的异常处理都将被忽略。,示例3:#include void fun(int code)tryif(code=0)throw code;/引发int类型的异常if(code=1)throw x;/引发char类型的异常if(code=2)throw 12.345;/引发double类型的异常catch(int n)cout捕获整数类型:nendl;catch(char c)cout捕获字符类型:cendl;,catch(double d)cout捕获双精度类型:dendl;return;void main()fun(0);fun(1);fun(2);,程序中同时列出多
9、个catch语句时,将以catch语句在程序中出现的次序作类型匹配,并且只有一个匹配的catch语句被执行,其他的catch语句将被忽略。catch(.)是一个特殊的捕获语句,可以捕获任何异常,因而在任何情况下其他catch子句都不被检查。所以,catch(.)应该放在最后。在VC+6.0中,若catch(.)不是放在所有catch(.)语句的最后,则会出现编译错误。,2、捕获异常,示例1:#include void fun(int code)tryif(code=0)throw code;/引发int类型的异常 if(code=1)throw x;/引发char类型的异常 if(code=2
10、)throw 12.345;/引发double类型的异常catch(int n)cout捕获整数类型.nendl;catch(.)cout默认捕获.endl;return;,void main()fun(0);fun(1);fun(2);,从前面异常处理的例子可以看出,调用一个函数时,除了了解函数的参数与返回值外,还必须了解函数的异常引发方式,以便设计异常处理程序,应付函数调用过程中引发的异常。异常的引发与捕获已成为函数之间界面的一部分,有必要在函数原型中也列出异常引发。例如:void fun(int i)throw(t1,t2,t3);,3、带有异常声明的函数原型,C+的异常处理机制不仅能够
11、处理各种不同类型的异常,还具有为抛出异常前构造所有局部对象自动调用析构函数的能力。在程序中,找到一个匹配的catch异常处理后,如果catch子句的异常类型说明是一个值参数,则其初始化方式是复制被抛出的异常对象。如果catch子句的异常类型说明是一个引用,则其初始化方式是使该引用指向异常对象。当catch子句的异常类型说明参数被初始化后,便于始展开栈的过程。这包括将从对应的try块开始到异常被抛出之间构造(且尚未析构)的所有自动对象进行析构。析构的次序与构造的次序相反。然后程序从最后一个catch处理之后开始恢复执行。,异常处理中对象的构造与析构,示例:#include void fun(vo
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 面向 对象 异常 处理 YH
链接地址:https://www.31ppt.com/p-5364935.html