面向对象程序设计 第十二章 异常处理机制

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第10章异常处理机制本章主要内容:●异常处理的任务与思想●异常处理的实现●异常处理的应用●异常处理中的构造与析构●C++标准异常类10.1异常处理的任务与思想●软件不仅要保证能正确完成任务,还应当具有良好的容错性。●容错性是指软件不仅在正确操作的条件下能正确运行,而且当环境异常或不当使用时,依然能合理处理运行过程中的出现的各种异常,而不会产生各种意想不到的后果。●程序中的各种异常通过分析完全可以预料。●根据异常的不同情况进行对异常进行处理,如给出提示信息、允许用户排除环境错误、继续运行程序等都是异常处理的基本任务。1.传统的异常处理方法●传统程序设计方法中,通常采用系统提供的中断函数或指令。●当被调用函数发生异常或产生错误时,返回一个特定的值,以便调用函数检测错误标志,并作出处理;或当错误产生时,释放所有资源,结束程序运行常用中断函数或指令函数原型/指令功能头文件voidabort()中断程序执行,返回主C++窗口stdlib.hvoidassert(表达式)若表达式的值为false则中断程序执行,并显示中断所在的文件和所在行号assert.hvoidexit(状态)中断程序执行,返回退出代码(状态值)stdlib.hreturn表达式终止函数执行,返回表达式的值#includeiostream.hdoublediv(double,double);voidmain(){doublex,y;coutPleaseinputy=;ciny;coutPleaseinputx=;cinx;if(x==0)coutDividedbyzero,Error!endl;else{coutq=div(x,y)endl;}coutEndoftheprogram.endl;}doublediv(doublex,doubley){returny/x;}传统异常处理方法的优点是异常处理直接,系统运行开销少,适用于处理简单的局部错误与异常。不足之处是异常处理代码分布于程序中可能出错的各个地方,异常处理代码与系统功能实现代码混在一起,降低程序的可读性与可维护性,不适合大型软件的开发,也不符合现代软件工程的理念2.C++异常处理机制●在大型软件中,由于函数之间具有各自明确的分工并可能存在调用关系,发生错误的函数可能不便于或不具备处理错误的条件。●C++异常处理机制的基本思想是将异常检测与异常处理分离。产生异常的函数不一定需要具备异常处理的能力,当一个函数发生异常时,它抛出所发生的异常或错误,由调用者捕获或处理异常,若上层调用函数仍不便于处理异常,还可以进一步抛出异常,按调用层次关系传递给更上一层处理。2.C++异常处理机制函数f()捕获并处理异常函数h()引发异常函数g()……调用者异常传播方向调用关系10.2C++异常处理的实现●C++语言提供了对异常处理机制的内部支持●由try、throw和catch语句提供了C++用于实现异常处理的机制。●在异常处理机制的支持下,可以更合理、更有效的处理程序运行过程中存在的各种异常现象。1.异常处理的语法●try-throw-catch是C++异常处理机制的实现语句;●程序中可能产生异常的部分应包含于try块之中;●异常由紧随其后的catch语句捕获和处理;●throw语句的作用是抛出异常。异常处理程序的使用形式try{语句;}catch(类型1参数1){与类型1相关的异常处理语句;}catch(类型2参数2){与类型2相关的异常处理语句;}┇catch(类型n参数n){与类型n相关的异常处理语句;}throw表达式使用格式如下:throw表达式;●try语句块实际上是程序代码的保护段,表明该程序段在执行过程中可能会产生异常或出现错误;●若预料某段程序代码或某个函数可能发生异常或错误,就应当将之置于try语句块之内;●一旦该代码段或函数在调用过程中产生了异常情况,throw语句将抛出这个异常,并通过throw之后的表达式返回一个值;有关说明●当函数出现了自己不能处理的异常,就可以使用“throw表达式”将异常抛出;●throw之后的“表达式”表示异常类型,它在语法上与return语句的“表达式”值类似;●throw语句表达式的值不能用来区分不同异常,所以当程序将要抛出多个异常,应该用不同类型的表达式值相互区别;有关说明(续)●catch语句块是异常处理的程序代码,捕获和处理由“throw表达式”所抛出的异常。●catch之后的异常类型可以是任何有效的数据类型,它与函数的形参类似,既可以是int、float等某个类型值,也可以是引用及C++的类,它用于指定catch语句块所处理的异常的类型;●当异常被抛出后,catch块依次被检查,若某catch语句块的异常类型与被抛出的异常类型一致,则执行该异常处理程序段。有关说明(续)●在一个try语句块内,异常处理程序将按照它出现的位置先后顺序进行检查。若找到一个匹配的异常类型,后面的异常处理都将被忽略;●如果异常类型声明是一个省略号(…),则表示catch语句可以处理任何类型的异常;●类型为省略号的catch处理程序必须是try块的最后一段处理程序。有关说明(续)doublediv(doublex,doubley){if(x==0)throwy;//若x=0时,抛出异常returny/x;}#includeiostream.hdoublediv(double,double);voidmain(){doublex,y;try//try语句块{coutPleaseinputy=;ciny;coutPleaseinputx=;cinx;coutq=div(x,y)endl;}catch(double)//捕获异常{coutDividedbyzero,Error!endl;}coutEndoftheprogram.endl;}异常处理的执行过程●通过正常的执行顺序直到try语句,然后执行try块内的保护段。●若保护段在执行期间没有产生异常,则try语句块后的catch块不会被执行,程序从最后一个catch语句块后面的语句继续执行。异常处理的执行过程(续)●若保护段在执行期间或保护段调用的任何函数中(直接或间接的调用)有异常抛出,则从通过throw操作数创建的对象中创建一个异常对象。然后寻找catch语句块或一个能处理任何类型异常的catch处理块。catch语句块按其出现的顺序被检查,如果没有匹配的catch处理块,则继续检查下一个动态封闭的try块,直到最外层的封闭try块被检查完。异常处理的执行过程(续)●若没有匹配的catch处理块,则terminate函数将被自动调用,而terminate函数的默认功能是调用abort函数终止程序。●若有匹配的catch处理块,如果它通过值进行捕获,则其形参通过复制异常对象进行初始化。如果它通过引用进行捕获,则参量被初始化为指向异常对象。在形参被初始化之后,对那些在与catch处理器相对应的try块开始和异常抛出点之间创建、但尚未析构的所有自动对象进行析构,然后执行catch处理程序。多种异常的检测。#includeiostream.hdoublejudgement(char*ptr,intag,doublesal);voidmain(){charname[20];doublesalary;intage;coutPleaseinputname:endl;cinname;coutPleaseinputage:endl;cinage;coutPleaseinputsalary:endl;cinsalary;if(judgement(name,age,salary)){coutname=nameendl;coutage=ageendl;coutsalary=salaryendl;}coutEndoftheprogram.endl;}doublejudgement(char*ptr,intag,doublesal){boollogic;logic=true;try{if(a16)throwag;if(s530)throwsal;}catch(intag){logic=false;cout职工年龄小于16岁,违反劳动法!agendl;}catch(doublesal){logic=false;cout工资低于本市最低工资530元,违反劳动!salendl;}returnlogic;}●C++程序设计中经常发生函数调用,在调用函数时除需要了解函数参数值和返回值类型之外,当函数有异常抛出时,还需要知道函数抛出异常的方式,以方便调用函数(主调函数)对异常进行处理.函数异常接口的声明进一步提高了程序的可读性。●异常的抛出、捕获与处理已经成为函数接口的一部分,因此,在函数原型中需要指定函数可以抛出的异常类型。2.异常处理接口1.指定异常类型类型函数名(参数表)throw(A1,A2,…,An);函数原型声明表明可以抛出的异常类型为A1,A2,…,An及这些类型的子类型异常。指定函数所抛出的异常的形式:指定函数所抛出的异常的形式(续)2.抛出任意类型异常类型函数名(参数表);函数原型没有throw的说明,该函数可以抛出任意类型的异常。指定函数所抛出的异常的形式(续)3.不抛出异常类型函数名(参数表)throw();throw之后是一个空表,该函数原型声明表示该函数不抛出任何类型的异常。C++异常处理机制不仅能处理各种不同类型的异常,而且能处理构造函数异常,即具有为抛出异常前构造的所有局部对象自动调用析构函数的能力。3.异常处理中的构造与析构#includeiostream.hvoidTestFun();classTestA{public:TestA(){coutConstructingTestA...endl;};~TestA(){coutDestructingTestAendl;};voidDisplay(){coutClassTestAException!endl;}};classTestB{public:TestB();~TestB();};TestB::TestB(){coutConstructingTestBendl;}TestB::~TestB(){coutDestructingTestBendl;}voidTestFun(){TestBtb;coutThrowTestAException!endl;throwTestA();}voidmain(){coutNowEntermain()endl;try{coutNowCallTestFun()endl;TestFun();}catch(TestAta){coutAnTestAExceptionOccurred!endl;ta.Display();}catch(...){coutOtherExceptionOccurred!endl;}coutReturnmain()endl;}●C++标准库提供了包括exception类在内的9个标准异常类●exception类是异常类的基类,该类的成员函数都包含一个没有指定异常列表的throw()。:10.4C++标准异常类exception框架代码classexception{public:exception()throw();exception(constexception&rhs)throw();//复制构造函数exception&operator=(constexception&rhs)throw();virtual~exception()throw()virtualconstchar*what()constth

1 / 31
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功