您好,欢迎访问三七文档
第12章异常处理•程序设计的要求之一就是程序的健壮性。希望程序在运行时能够不出或者少出问题。但是,在程序的实际运行时,总会有一些因素会导致程序不能正常运行。•异常处理(ExceptionHandling)就是要提出或者是研究一种机制,能够较好的处理程序不能正常运行的问题。12.1异常处理概述•异常(Exceptions)是程序在运行时可能出现的会导致程序运行终止的错误。•编译系统检查出来的语法错误,导致程序运行结果不正确的逻辑错误,都不属于异常的范围。•异常是一个可以正确运行的程序在运行中可能发生的错误。异常与错误•异常是在执行程序的过程中出现的错误或异常情况•错误是指在编写和编译程序时存在的问题–逻辑错误–语法错误常见的异常:–系统资源不足。如内存不足,不可以动态申请内存空间;磁盘空间不足,不能打开新的输出文件,等。–用户操作错误导致运算关系不正确。如出现分母为0,数学运算溢出,数组越界,参数类型不能转换,等。异常特点:–偶然性。程序运行中,异常并不总是会发生的。–可预见性。异常的存在和出现是可以预见的。–严重性。一旦异常发生,程序可能终止,或者运行的结果不可预知。异常处理:——程序设计语言提供的一种用于管理程序运行期间异常的结构化方法。异常处理方法及举例•对于程序中的异常,通常有三种处理的方法:–不作处理。很多程序实际上就是不处理异常的。–发布相应的错误信息,然后,终止程序的运行。在C语言的程序中,往往就是这样处理的。–适当的处理异常,一般应该使程序可以继续运行。例1:程序将连续地输入两个实数,通过调用函数,返回这两个数相除的商,并且要注意除数不能为0。//用一般的方法处理除法溢出#includeiostream#includestdlibdoubledivide(doublea,doubleb){if(b==0)//检测分母是不是为0{cout除数不可以等于0!endl;abort();//调用abort函数终止运行}returna/b;}voidmain(){doublex,y,z;cout输入两个实数x和y:;while(cinxy){z=divide(x,y);coutx除以y等于z\n;cout输入下一组数q表示结束:;}coutBye!\n;}如果出现分母为0的情况,运行将出现以下结果:•这个程序中,对于除数为0的处理有这样的特点:–异常的检测和处理都是在一个程序模块(divide函数)中进行的;–由于函数的返回值是double型的数据,因此,即使检测到除数为0的情况,也不能通过返回值来反映这个异常。只能调用函数abort终止程序的运行。一般来说,异常处理(ExceptionHandling)就是在程序运行时对异常进行检测和控制。而在C++中,异常处理(EH)就是用C++提供的try-throw-catch的模式进行异常处理的机制。12.2C++语言中的异常处理•C++处理异常机制的基本思想:–异常的检测和处理分离:•在“try”部分检测异常•在“catch”部分处理异常–由于异常的检测和处理不是在同一个代码段中进行的,在检测异常和处理异常的代码段之间需要有一种传递异常信息的机制,在C++中是通过“对象”来传递异常的。C++异常处理语法:try{受保护语句;throw异常;其他语句;}catch(异常类型){异常处理语句;}检测和抛掷异常扑获和处理异常异常处理的实现:–try块,也称为监视部分–throw表达式,指示异常的种类–catch处理程序,在发生异常时执行例2#includeiostream.hintmain(){try{intage;cout请输入您的年龄:;cinage;if(age100||age1)throw年龄无效!;coutthrow语句之后endl;}catch(char*msg){cout错误!msgendl;}coutcatch处理程序之后endl;return0;}注意:在try复合语句中,可以调用其他函数,在所调用的函数中检测和抛掷异常,而不是在try复合语句中直接抛掷异常。这个所调用的函数,仍然是属于这个try模块的,所以这个模块中的catch部分,仍然可以捕获它所抛掷的异常并进行处理。例3:用C++的异常处理机制,重新处理例1。//用C++的异常处理机制,处理除法溢出#includeiostream#includestdlibdoubledivide(doublea,doubleb){if(b==0){throw输入错误:除数不可以等于0!;}returna/b;}voidmain(){doublex,y,z;cout输入两个实数x和y:;while(cinxy){try{z=divide(x,y);}catch(constchar*s)//startofexceptionhandler{couts\n;cout输入一对新的实数:;continue;}//endofhandlercoutx除以y等于z\n;cout输入下一组数q表示结束:;}cout程序结束,再见!\n;}程序运行结果:输入两个实数x和y:1.23.2x除以y等于0.375输入下一组数q表示结束:3.40输入错误:除数不可以等于0!输入一对新的实数:2.34.5x除以y等于0.511111输入下一组数q表示结束:q程序结束,再见!例3程序分析:–在try的复合语句中,调用了函数divide。因此,尽管divide函数是在try模块的外面定义的,它仍然是属于try模块:在try语句块中运行;–divide函数检测到异常后,抛掷出一个字符串作为异常对象,异常的类型就是字符串类型;–catch程序块指定的异常对象类型是char*,可以捕获字符串异常。捕获异常后的处理方式是通过continue语句,跳过本次循环,也不输出结果,直接进入下一次循环,要求用户再输入一对实数。例3执行过程•编写带有异常处理的程序时注意:–try语句块和catch语句块是一个整体,两者之间不能有其他的语句;–一个try语句块后面可以有多个catch语句,但是,不可以几个try语句块后面用一个catch语句。小结•本章介绍了C++异常处理的机制。在程序设计中使用这样的异常处理机制,有助于提高程序的健壮性、可读性。而且可以防止因为程序不正常结束而导致的资源泄漏,如创建的对象不能释放等。
本文标题:第12章 异常处理
链接地址:https://www.777doc.com/doc-3178382 .html