C++第10章 异常处理和跟踪调试_第1页
C++第10章 异常处理和跟踪调试_第2页
C++第10章 异常处理和跟踪调试_第3页
C++第10章 异常处理和跟踪调试_第4页
C++第10章 异常处理和跟踪调试_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

第九章内容回顾模板的概念模板函数类模板标准模板库第十章异常处理和跟踪预习检查捕获异常的关键字是什么?举出一个异常的例子?3本章结构异常概念异常处理和跟踪调试异常的实现和基本规则异常的基本思想多路捕捉异常处理机制使用异常的方法10-1异常概念程序的错误,一种是编译错误,即语法错误另一种是在运行时发生的错误不可预料的逻辑错误逻辑错误是由于不当的设计造成的可以预料的运行异常运行异常.可以预料,但不能避免,它是由系统运行环境造成的。然而这些错误是能够预料的,通常加入一些预防代码便可防止这些异常10-1异常概念异常处理的基本思想C++异常处理的实现异常处理中的构造与析构10-1-1异常处理的基本思想函数f()捕获并处理异常函数h()引发异常函数g()……调用者异常传播方向调用关系10-1-1异常处理的基本思想抛掷异常的程序段捕获并处理异常的程序段......throw表达式;......try

复合语句catch(异常类型声明)复合语句catch(异常类型声明)复合语句

…10-1-1异常处理的基本思想异常的基本思想是(1)实际的资源分配(如内存申请或文件打开)通常在程序的低层进行

(2)当操作失败、无法分配内存或无法打开一个文件时,在逻辑上如何进行处理通常是在程序的高层(3)异常为从分配资源的代码转向处理错误状态的代码提供了—种表达方式。如果还存在中间层次的函数,则为它们释放所分配的内存提供了机会,但这并不包括用于传递错误状态信息的代码。10-1-1异常处理的基本思想f()g()k()异常处理继续运行发生异常函数调用链10-1-2异常的实现及基本规则异常处理机制#include<iostream.h>int

Div(int

x,inty);intmain(){ try {cout<<"5/2="<<Div(5,2)<<endl;

cout<<"8/0="<<Div(8,0)<<endl;

cout<<"7/1="<<Div(7,1)<<endl; }

catch(int) {cout<<"exceptofdevidingzero.\n";}

cout<<"thatisok.\n";}int

Div(int

x,inty){ if(y==0)throwy; returnx/y;}程序运行结果如下:5/2=2exceptofdevidingzero.thatisok.10-1-2异常的实现及基本规则编写异常处理程序的规则是任意数量的catch分程序立即出现在try分程序之后。在catch行的圆括号中可包含数据类型声明如果一个函数抛掷一个异常,但在通往异常处理函数的调用链中找不到与之匹配的catch,则该程序通常以abort()函数调用终止

10-2多路捕捉多数程序可能有若干不同种类的运行错误,它们可以用异常处理机制。每种错误可与一个类、一个数据类型或一个值有关。这样,在程序中就会出现多路捕获。10-2多路捕捉 classRange {//异常类1

public:

Range(int

j):index(j){}

intindex;

};

classSize{};//异常类2char&operator[](intk)

{

if(0<=k&&k<len)

returnp[k];

throwRange(k);

}

10-2多路捕捉

if(si<0||max<si)

throwSize();try{

//代码区2

Strings("abcdefghijklmnop",10);

g(s);

}

catch(String::Ranger)

{

cerr<<"->outofrange:"<<r.index<<endl;

//代码区3

}

catch(String::Size)

{

cerr<<"sizeillegal!\n";

}

10-3异常处理机制异常处理机制若有异常则通过throw操作创建一个异常对象并抛掷。将可能抛出异常的程序段嵌在try块之中。控制通过正常的顺序执行到达try语句,然后执行try块内的保护段。如果在保护段执行期间没有引起异常,那么跟在try块后的catch子句就不执行。程序从try块后跟随的最后一个catch子句后面的语句继续执行下去。catch子句按其在try块后出现的顺序被检查。匹配的catch子句将捕获并处理异常(或继续抛掷异常)。如果匹配的处理器未找到,则运行函数terminate将被自动调用,其缺省功能是调用abort终止程序10-3异常处理机制异常处理机制f()g()h()H1()Range(size)trytryThrowsizetryThrowrangeSizethrowh2()h3()ThrowmatherrThrowsize10-4使用异常的方法多个异常组成族系构成异常族系的一些示例有数学错误异常族系文件处理错误异常族系。在c++代码中把异常组在一起有两种方式:异常枚举族系异常派生层次结构。10-4使用异常的方法例如,下面的代码是一个异常枚举族系的例子:

enum

FileErrors{nonExist,wrongFormat,diskSeekError....};try

{

//...

throwwrongFormat;

}

catch(FileErrors

fe)

{

switch(re)

{

casenonExist:

//...

casewrongFormat:

//...

casediskSeekError:

//...10-4使用异常的方法对于类的派生,下列情况可以捕获异常:异常处理的数据类型是公有基类,抛掷异常的数据类型是派生类;

异常处理的数据类型是指向公有基类的指针,抛掷异常的数据类型是指向派生类的指针。>对于派生层次结构的异常处理,catch块组中的顺序是重要的。异常处理程序的两种状态:正常状态和异常状态,发生不正常情况后,进入异常状态,从当前函数开始,按调用链的相反次序,查找处理该异常的程序片断1.throw表达式语义:用表达式的值生成一个对象(异常对象),程序进入异常状态。终止程序的执行。2.try-catch语句try{ 包含可能抛出异常的语句;}catch(类型名[形参名]){ 异常处理}catch(类型名[形参名]){ 异常处理}异常处理#include<iostream.h>#include<math.h>doublesqrt_delta(doubled){if(d<0)throw1;returnsqrt(d);}voidmain(){

try

{cout<<sqrt_delta(10)<<endl;}catch(int)

{cout<<"exception";}}异常处理程序二;#include<iostream>usingnamespacestd;voidfun(intx){try{if(x==1)throw1;if(x==2)throw1.0;if(x==3)throw"1";}catch(int){cout<<"catchanintinfun()"<<endl;}catch(double){cout<<"catchandoubleinfun()"<<endl;}cout<<"testingexceptioninfun()..."<<endl; }异常处理voidgun(){try{//fun(1);//fun(2);//fun(3);fun(4);}catch(char){cout<<"catchacharingun()"<<endl;}cout<<"testingexceptioningun()..."<<endl;}intmain(){gun();}异常处理3.扑获所有异常catch(...){}例:#include<iostream>usingnamespacestd;voidfun(){try{}catch(...){cout<<"catchallexception..."<<endl;}catch(int){cout<<"catchintexception..."<<endl;}}异常处理4.异常规范指出函数可以抛出的所有异常类型名。语法:值类型函数名(形参表)throw(类型名表)函数体若无异常接口声明,则此函数可以抛掷任何类型的异常。不抛掷任何类型异常的函数声明如下:#include<iostream>usingnamespacestd;voidfunction(intx)throw(){if(x==1)throw1;}无异常规范表示可抛出任何异常。voidfunction(intx){if(x==1)throw1.5; }异常处理对于函数指针,例如:#include<iostream>usingnamespacestd;voidfunction(intx)throw(int){if(x==1)throw1;}intmain(){void(*fp)(int)throw(int);//不是必须的

温馨提示

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

评论

0/150

提交评论