C-面向对象程序设计ppt课件-第8章(未讲)_第1页
C-面向对象程序设计ppt课件-第8章(未讲)_第2页
C-面向对象程序设计ppt课件-第8章(未讲)_第3页
C-面向对象程序设计ppt课件-第8章(未讲)_第4页
C-面向对象程序设计ppt课件-第8章(未讲)_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

第8章异常处理1《面向对象技术与VisualC++》--第8章第8章异常处理1《面向对象技术与VisualC++》-本章主要内容异常处理概述异常处理的语法应用实例2《面向对象技术与VisualC++》--第8章本章主要内容异常处理概述2《面向对象技术与VisualC异常处理概述

异常处理是由程序设计语言提供的运行时刻错误处理的一种方式。程序运行中的有些错误是可以预料但不可避免的,这是要力争做到允许用户排除环境错误,继续运行程序;至少要给出适当的提示信息。传统错误处理方法大致可以分为返回码机制和全局变量两种。3《面向对象技术与VisualC++》--第8章异常处理概述异常处理是由程序设计语言提供的运行时刻错误处理1.返回码机制这种处理错误的方法比较实用和简单,这也是经常采取的手段之一。对于小型的程序来说这种异常处理机制的缺点暴露不明显,对于一个需要多人开发的软件程序来说,它的弊端就非常明显!因为对于一个模块的实现者来说有的人返回值0代表错误;有的人返回值0代表正确,非0代表错误。解决方法可以用一致性的条文来控制。通常的,这些返回码就在一个公共的.h文件中以宏的形式存在。这样暂时解决了团队之间的一致性,但是这些都不是标准,兼容性太差。对于如此多的返回码要分别解释各自的意义,从调用者的角度来说,需要分别对返回码进行检查来处理异常,这样的代码往往就显得非常的臃肿,大大降低了可读性。4《面向对象技术与VisualC++》--第8章1.返回码机制4《面向对象技术与VisualC++》--第2.全局变量通过用一个全局变量来表示一次操作是否成功。这个方法在多线程中就非常头痛。另外在每次处理完异常之后就要复位这个变量,如果忘记这个步骤,就会引起其他操作的误解。5《面向对象技术与VisualC++》--第8章2.全局变量5《面向对象技术与VisualC++》--第8异常处理实现

C++语言提供对处理异常情况的内部支持。try,throw和catch语句就是C++语言中用于实现异常处理的机制。有了C++异常处理,程序可以向更高的执行上下文传递意想不到的事件,从而使程序能更好地从这些异常事件中恢复过来。6《面向对象技术与VisualC++》--第8章异常处理实现C++语言提供对处理异常情况的内部支持。try例8-2示例使用异常处理来处理错误。#include<iostream.h>voidmain(){ intdivisor,dividend; doublequotient;

try //异常测试块定义 { cout<<"Pleaseinputdividend:"; cin>>dividend; cout<<"Pleaseinputdivisor:"; cin>>divisor; if(divisor==0)

throwdividend; //抛出异常 quotient=dividend/double(divisor); cout<<"Theresultis:"<<quotient<<endl; }7《面向对象技术与VisualC++》--第8章例8-2示例使用异常处理来处理错误。7《面向对象技术与Vcatch(int) //捕获异常{cout<<"Thedivisoriszero,worry!!!"<<endl;}cout<<"Endofprogram."<<endl;}8《面向对象技术与VisualC++》--第8章catch(int) //捕获异常8《面向对象异常处理的语法try-throw-catch是抛出和捕获异常的基本机制。Throw语句抛出异常(一个值),catch捕获异常。抛出一个异常后,try块会终止,转而执行catch块中的语句。catch块结束之后,会继续执行catch块之后的语句(前提是catch块中没有终止程序或者执行另外一些特殊的操作)。如果try块中没有抛出异常,那么在try块结束之后,程序将从catch块之后的语句继续执行。换言之,如果没有抛出异常,catch块会被忽略。9《面向对象技术与VisualC++》--第8章异常处理的语法try-throw-catch是抛出和捕获异常try块

如果在函数内直接用throw抛出一个异常(或在函数调用时抛出一个异常),将在异常抛出时退出函数。如果不想在异常抛出时退出函数,可以在函数体内创建一个特殊块用于解决程序中潜在的错误,在这个块中可以测试各种错误发生的可能性,通常称为测试块,它由关键字try引导。其定义格式如下:try{<可能发生错误的语句><语句><更多的语句>}10《面向对象技术与VisualC++》--第8章try块如果在函数内直接用throw抛出一个异常(或在函数抛出异常

通常将抛出的值直接称为一个异常,所以执行throw语句就称为抛出异常,可以抛出任意类型的一个值。其定义的格式如下:throw<抛出值的表达式>

执行throw语句时,外围的try块就会停止执行。如果try块之后跟有一个合适的catch块,那么控制权就会转交给那个catch块。一般说来,throw语句几乎肯定要嵌入一个分支语句(比如if语句)中。11《面向对象技术与VisualC++》--第8章抛出异常通常将抛出的值直接称为一个异常,所以执行throw捕获异常

抛出一个异常后,外围的try块会停止执行,并开始执行另一个部分的语句,也就是catch块。执行catch的过程称为捕获异常或者异常处理。一个异常被抛出以后,最终应该由某个catch块来处理。12《面向对象技术与VisualC++》--第8章捕获异常抛出一个异常后,外围的try块会停止执行,并开始执一般说来,catch块参数主要完成两件事情:catch块参数前要加一个类型名,表示catch块可以捕获什么类型的异常抛出值;catch块参数为捕获的异常抛出值指定了一个名称,所以在catch块中,又可以对这个异常抛出值进行相应的处理。13《面向对象技术与VisualC++》--第8章一般说来,catch块参数主要完成两件事情:13《面向对象技catch块的语法定义如下:catch(type_namevariable_name){<处理异常的相关语句>}需要注意的是,如果try块中没有异常被抛出,那么在try块正常结束后,程序从catch块之后的语句继续执行。换言之,如果没有抛出异常,catch块会被忽略。14《面向对象技术与VisualC++》--第8章catch块的语法定义如下:14《面向对象技术与Visual还可以定义一个能捕获任意类型的异常的处理器:catch(…){cout<<“anexceptionwasthrom”<<endl;}可捕获所有的异常,同时就不能有参数,因此不可能知道所接收到得异常为何种类型。15《面向对象技术与VisualC++》--第8章还可以定义一个能捕获任意类型的异常的处理器:catch(…)例8-3示例捕捉多个异常。#include<iostream.h>#include<string.h>classNegativenumber{public: Negativenumber(); Negativenumber(char*take_it_to_catch_block); char*get_message();private: charmessage[30];};16《面向对象技术与VisualC++》--第8章例8-3示例捕捉多个异常。16《面向对象技术与VisuaclassDividebyzero{};//定义异常类intmain(){ intdividend,divisor; doubleportion; try { cout<<"Enterdividend:"; cin>>dividend; if(dividend<0) throwNegativenumber("dividend"); cout<<"Enterdivisor:"; cin>>divisor; if(divisor<0) throwNegativenumber("divisor"); if(divisor!=0)portion=dividend/(double)divisor; else throwDividebyzero(); cout<<"Theresultis:"<<portion<<endl; }17《面向对象技术与VisualC++》--第8章classDividebyzero{};//定义异catch(Negativenumbere) { cout<<"Cannothaveanegativenumberof“<<e.get_message()<<endl; } catch(Dividebyzero) { cout<<"Thedivisoriszero.worry!!!"<<endl; }cout<<"Endofprogram."<<endl;return1;}18《面向对象技术与VisualC++》--第8章catch(Negativenumbere)18《面向对象Negativenumber::Negativenumber(){}Negativenumber::Negativenumber(char*take_it_to_catch_block){strcpy(message,take_it_to_catch_block);}char*Negativenumber::get_message(){ returnmessage;}说明:ClassDividebyzero{};这个异常类没有成员变量和成员函数,但它很有用。抛出Dividebyzero类的一个对象,会激活相应的catch块。19《面向对象技术与VisualC++》--第8章Negativenumber::NegativenumberClassDividebyzero{};这个异常类没有成员变量和成员函数,但它很有用。抛出Dividebyzero类的一个对象,会激活相应的catch块。20《面向对象技术与VisualC++》--第8章ClassDividebyzero{};20《面向对象技术8.2.2异常处理中的构造与析构1.C++异常处理的真正能力,不仅在于它能够处理各种不同类型的异常,还在于它具有为异常抛投前构造的所有局部对象自动调用析构函数的能力。2.如果catch子句的异常类型声明是一个值参数,则其初始化方式是复制被抛投的异常对象。如果catch子句的异常类型声明是一个引用,则其初始化方式是使该引用指向异常对象。3.将从对应的try块开始到异常被抛投之间构造(且尚未析构)的所有自动对象进行析构。21《面向对象技术与VisualC++》--第8章8.2.2异常处理中的构造与析构21《面向对象技术与Visu例异常处理时的析构#include<iostream.h>voidMyFunc(void);classExpt{public:Expt(){};~Expt(){};constchar*ShowReason()const{return"Expt类异常。"; }};22《面向对象技术与VisualC++》--第8章例异常处理时的析构#include<iostreamclassDemo{public:Demo();~Demo();};Demo::Demo(){cout<<"构造Demo."<<endl;}Demo::~Demo(){cout<<"析构Demo."<<endl;}23《面向对象技术与VisualC++》--第8章classDemo23《面向对象技术与VisualC++voidMyFunc(){DemoD;cout<<"在MyFunc()中抛掷Expt类异常。"<<endl;throwExpt();}intmain(){cout<<"在main函数中。"<<endl;try{cout<<"在try块中,调用MyFunc()。"<<endl;MyFunc();}24《面向对象技术与VisualC++》--第8章voidMyFunc()24《面向对象技术与Visualcatch(ExptE){cout<<"在catch异常处理程序中。"<<endl;cout<<"捕获到Expt类型异常:";cout<<E.ShowReason()<<endl;}catch(char*str){cout<<"捕获到其它的异常:"<<str<<endl;}cout<<"回到main函数。从这里恢复执行。"<<endl;return0;}25《面向对象技术与VisualC++》--第8章catch(ExptE)25《面向对象技术与V程序运行时输出:在main函数中。在try块中,调用MyFunc()。构造Demo.在MyFunc()中抛掷Expt类异常。析构Demo.在catch异常处理程序中。捕获到Expt类型异常:Expt类异常。回到main函数。从这里恢复执行。26《面向对象技术与VisualC++》--第8章程序运行时输出:26《面向对象技术与VisualC++》-例8-4示例处理不同类型的异常。要求可以触发不同类型异常并显示抛出异常时的程序执行情况。#include<iostream.h>classCExcept{public: CExcept(intExcode) { m_Excode=Excode; } intGetExcode() { returnm_Excode; }private: intm_Excode;};27《面向对象技术与VisualC++》--第8章例8-4示例处理不同类型的异常。要求可以触发不同类型异常voidmain(){ charch; try { cout<<"Atbeginingoftryblock."<<endl; cout<<"Throw'char*'exception?(y/n):"; cin>>ch; if(ch=='y'||ch=='Y') throw"Errordescription."; cout<<"Throw'int'exception?(y/n):"; cin>>ch; if(ch=='y'||ch=='Y') throw1;28《面向对象技术与VisualC++》--第8章voidmain()28《面向对象技术与VisualC+ cout<<"Throw'classCExcept'exception?(y/n):"; cin>>ch; if(ch=='y'||ch=='Y') throwCExcept(5); cout<<"Throw'double'e

温馨提示

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

评论

0/150

提交评论