当前位置:高等教育资讯网  >  中国高校课件下载中心  >  大学文库  >  浏览文档

《VISUAL C++程序设计基础》(PPT教学课件)第十章 异常处理

资源类别:文库,文档格式:PPT,文档页数:35,文件大小:266.5KB,团购合买
10.1 异常的概念 10.2 异常处理的机制 10.3 捕获异常 10.4 异常的重新抛出和catch_all子句 10.5 异常规范 10.6 异常和继承 10.7 C++标准库的异常类层次结构
点击下载完整版文档(PPT)

第十章异常处理 编写大型和十分复杂的程序,往往会产生· 些很难查找的错误。面向对象的异常处理 ( exception handling)机制是C++语言用以解 决这个问题的有力工具。函数执行时,放在try (测试)程序块中的任何类型的数据对象发生 异常,都可被 throw块抛出,随即沿调用键退回, 直到被 catch块捕获,并在此执行异常处理,报 告出现的异常等情况。从抛出到捕获,应将各 嵌套调用函数残存在栈中的自动对象、自动变 量和现场保护内容等进行清除。如果已退到入 口函数还未捕获则由 abort(来终结入口函数

第十章 异常处理 编写大型和十分复杂的程序,往往会产生一 些很难查找的错误。面向对象的异常处理 (exception handling)机制是C++语言用以解 决这个问题的有力工具。函数执行时,放在try (测试)程序块中的任何类型的数据对象发生 异常,都可被throw块抛出,随即沿调用键退回, 直到被catch块捕获,并在此执行异常处理,报 告出现的异常等情况。从抛出到捕获,应将各 嵌套调用函数残存在栈中的自动对象、自动变 量和现场保护内容等进行清除。如果已退到入 口函数还未捕获则由abort()来终结入口函数

第十章异常处理 10.1异常的概念 10.5异常规范 10.2异常处理的机制 10.6异常和继承 10.3捕获异常 10.7C++标准库的异常类层次结构 10.4异常的重新抛出和 catch all子句

第十章 异常处理 10.1 异常的概念 10.3 捕获异常 10.2 异常处理的机制 10.5 异常规范 10.7 C++标准库的异常类层次结构 10.6 异常和继承 10.4 异常的重新抛出和catch_all子句

10.1异常的念 大的软件不可能没有错误,也不可能在排除所有的错误后才 投入使用。找出所有潜在的运行时错误那几乎是不可能的,能够做 到的是预计可能发生什么类型的错误,并在错误发生时停止发生错 误的操作,对它进行处理,而程序的其它部分仍然继续运行。 这里所讲的异常( exception)是程序可能检测到的,运行时 不正常的情况,如存储空间耗尽、数组越界、被0除等等,可以预 见可能发生在什么地方,但是无法确知怎样发生和何时发生。特别 在一个大型的程序(软件)中,程序各部分是由不同的小组编写的, 它们由公共接口连起来,错误可能就发生在相互的配合上,也可能 发生在事先根本想不到的个别的条件组合上。然后由预先安排的程 序段来捕获( catch)异常,并对它进行处理。这种机制可以在 C++程序的两个无关(往往是独立开发)的部分进行“异常”通 信 四P四

10.1 异常的概念 大的软件不可能没有错误,也不可能在排除所有的错误后才 投入使用。找出所有潜在的运行时错误那几乎是不可能的,能够做 到的是预计可能发生什么类型的错误,并在错误发生时停止发生错 误的操作,对它进行处理,而程序的其它部分仍然继续运行。 这里所讲的异常(exception)是程序可能检测到的,运行时 不正常的情况,如存储空间耗尽、数组越界、被0除等等,可以预 见可能发生在什么地方,但是无法确知怎样发生和何时发生。特别 在一个大型的程序(软件)中,程序各部分是由不同的小组编写的, 它们由公共接口连起来,错误可能就发生在相互的配合上,也可能 发生在事先根本想不到的个别的条件组合上。然后由预先安排的程 序段来捕获(catch)异常,并对它进行处理。这种机制可以在 C++程序的两个无关(往往是独立开发)的部分进行“异常”通 信

10.2异常处理的机制 首先,在C++中异常往往用类(cass)来实现,异常类的声明如下: class popOnEmptyi.i class pushon Fulk..i template void Stack: Push(const T&datat f(fu() throw pushon Fu( T data);//注意加了括号是构造一个无名对象 elements[++top]=data template T stack: Popo if(empty o throw poponEmptyo return elements[top--li 注意 pushOn Ful是类,C++要求抛出的必须是对象,所以必须有“()”,这样是调用构造函 数建立一个对象。异常并非总是类对象, throw表达式也可以抛出任何类型的对象,如枚举 整数等等。 throw表达式为异常处理的第一步

10.2 异常处理的机制 首先,在C++中异常往往用类(class)来实现,异常类的声明如下: class popOnEmpty{...}; class pushOnFull{...}; template void Stack::Push(const T&data){ if(full()) throw pushOnFull(T data);//注意加了括号,是构造一个无名对象 elements[++top]=data; } templateT stack::Pop(){ if(empty()) throw popOnEmpty(); return elements[top--]; } 注意pushOnFull是类,C++要求抛出的必须是对象,所以必须有“()” ,这样是调用构造函 数建立一个对象。异常并非总是类对象,throw表达式也可以抛出任何类型的对象,如枚举、 整数等等。throw表达式为异常处理的第一步

10.2异常处理的机制 在C++中建立异常抛出与异常处理之间有一整套程序设计的机制。 请看下面的程序段给出try块与 catch字句的关系。 int main({inta9]={123456,789}b[9]={0} stack stack(8 tryi for(i=O;i<9; i++)stack, Push(a[i]) stack. PrintstackO; } catch( pushon Fu)cerr<<”栈满”<<en} tryi for(i=O;i<9; i++i b[i]=istack PopO;33 catch( poponEmpty){cer<<”栈空”<<end for(i=0;i<9;i++)cout<<b[]<<'ti cout<<enda return o: 四P四 }

10.2 异常处理的机制 在C++中建立异常抛出与异常处理之间有一整套程序设计的机制。 请看下面的程序段给出try块与catch字句的关系。 int main(){ int a[9]={1,2,3,4,5,6,7,8,9},b[9]={0},i; stackistack(8); try{ for(i=0;i<9;i++)istack.Push(a[i]); istack.PrintStack(); } catch(pushOnFull){ cerr<<”栈满”<<endl; } try{ for(i=0;i<9;i++){ b[i]=istack.Pop(); } } catch(popOnEmpty){ cerr<<”栈空”<<endl; } for(i=0;i<9;i++)cout<<b[i]<<’\t’; cout<<endl; return 0; }

10.2异常处理的机制 程序按下列规则控制: 1.如果没有异常发生,继续执行try块中的代码,与ty块相关 联的 catch子句被忽略,程序正常执行,main(返回0。 2.当第一个try块在for循环中抛出异常,则该for循环退出, try块也退出,去执行 pushan叫异常的 catch子句。 stack Printstack(不再执行,被忽略 3.如果第二个try块调用Pop(抛出异常,则退出for和ty块 去执行 poponEmpty异常的 catch子句。 当某条语句抛出异常时,跟在该语句后面的语句将被跳过。程 序执行权交给处理异常的 catch子句,如果没有 catch子句能够处 理异常,则交给C++标准库中定义的 terminatel 四P四

10.2 异常处理的机制 程序按下列规则控制: 1.如果没有异常发生,继续执行try块中的代码,与try块相关 联 的catch子句被忽略,程序正常执行,main()返回0。 2.当第一个try块在for循环中抛出异常,则该for循环退出, try 块 也 退 出 , 去执行 pushOnFull 异常的 catch 子 句 。 istack.PrintStack()不再执行,被忽略。 3.如果第二个try块调用Pop()抛出异常,则退出for和try块, 去执行popOnEmpty异常的catch子句。 4.当某条语句抛出异常时,跟在该语句后面的语句将被跳过。程 序执行权交给处理异常的catch子句,如果没有catch子句能够处 理异常,则交给C++标准库中定义的terminate()

10.2异常处理的机制 在编制程序中有一条惯例:把正常执行的程序与异常处理两部分分隔 开来,这样使代码更易于跟随和维护 把程序的正常处理代码和异常处理代码分离的最清楚的方法是定义函数try 块( function try block)。这种方法是把整个函数包括在try块中 int maino try inta9]={123456789}b9]={0 stack stack (8; return OF catch( poponEmpty)cer<”栈空”<< tendle return1;} catche( pushAn叫)cer<"栈满”<< endieretur2;}|

10.2 异常处理的机制 在编制程序中有一条惯例:把正常执行的程序与异常处理两部分分隔 开来,这样使代码更易于跟随和维护。 把程序的正常处理代码和异常处理代码分离的最清楚的方法是定义函数try 块(function try block)。这种方法是把整个函数包括在try块中: int main() try{ int a[9]={1,2,3,4,5,6,7,8,9},b[9]={0},; stack istack(8); ......; return 0; } catch(popOnEmpty){cerr<<”栈空”<<endl;return 1;} catch(pushOnFull){cerr<<”栈满”<<endl;return 2;}

10.2异常处理的机制 最后强调: catch子句必须在try块 之后;而try块后必须紧跟一个或多个 catch子句,目的是对发生的异常进行处 理。 catch的括号中只能有一个类型,当 类型与抛掷异常的类型匹配时,称该 catch子句捕获了一个异常,并转到该块 中进行异常处理。 四P四

10.2 异常处理的机制 最后强调:catch子句必须在try块 之后;而try块后必须紧跟一个或多个 catch子句,目的是对发生的异常进行处 理。catch的括号中只能有一个类型,当 类型与抛掷异常的类型匹配时,称该 catch子句捕获了一个异常,并转到该块 中进行异常处理

10.3捕获异常 catch子句由三部分组成:关键字 catch、圆括号中的异常声明 ( exception declaration)以及复合语句中的一组语句。 catch子句 可以包含返回语句( return),也可不包含返回语句。包含返回语句, 则整个程序结束。而不包含返回语句,则执行 catch列表之后的下一条语 句 异常声明中也可以是一个对象声明。还是以栈为例。 pushan叫类 可如下定义: Template class pushon Fulk T value public pushOn Full(T i:value(ty //或等效写为 pushon Fu(inti)vaue=i} T valueotreturn value; y 四P四

10.3 捕获异常 catch子句由三部分组成:关键字catch、圆括号中的异常声明 (exception declaration)以及复合语句中的一组语句。catch子句 可以包含返回语句(return),也可不包含返回语句。包含返回语句, 则整个程序结束。而不包含返回语句,则执行catch列表之后的下一条语 句。 异常声明中也可以是一个对象声明。还是以栈为例。pushOnFull类 可如下定义: Template class pushOnFull{ T _value; public: pushOnFull(T i):_value(i){} //或等效写为pushOnFull(int i){value=i;} T value(){return _value;} };

10.3捕获异常 新的私有数据成员vaue保存那些不能被压入栈中的值。该值即调用构 造函数时的实参。对应在thow表达式中,构造抛出对象也要有实参: throw pushon Ful(data)//data即Push( const&data)中的参数data 这样在 catch子句中,要取得_ value,须调用 pushAn中的成员函数 value: catch(pushon Fulk eobj)t cerr<<”栈满”<< eobj value(<<”未压入栈”<<end return 1i 在 catch子句的异常声明中声明了对象eobj,用它来调用 pushon Fu类 的对象成员函数vaue(。异常对象是在抛出点被创建,与 catch子句是否显 式要求创建一个异常对象无关,该对象总是存在,在 catch子句中只是为了调 用异常处理对象的成员函数才声明为对象,不用类

10.3 捕获异常 新的私有数据成员_value保存那些不能被压入栈中的值。该值即调用构 造函数时的实参。对应在throw表达式中,构造抛出对象也要有实参: throw pushOnFull(data);//data即Push(const &data)中的参数data 这样在catch子句中,要取得_value,须调用 pushOnFull中的成员函数 value(): catch(pushOnFull eObj){ cerr<<”栈满”<<eObj.value()<<”未压入栈”<<endl; return 1; } 在catch子句的异常声明中声明了对象eObj,用它来调用pushOnFull类 的对象成员函数value()。异常对象是在抛出点被创建,与catch子句是否显 式要求创建一个异常对象无关,该对象总是存在,在catch子句中只是为了调 用异常处理对象的成员函数才声明为对象,不用类

点击下载完整版文档(PPT)VIP每日下载上限内不扣除下载券和下载次数;
按次数下载不扣除下载券;
24小时内重复下载只扣除一次;
顺序:VIP每日次数-->可用次数-->下载券;
共35页,可试读12页,点击继续阅读 ↓↓
相关文档

关于我们|帮助中心|下载说明|相关软件|意见反馈|联系我们

Copyright © 2008-现在 cucdc.com 高等教育资讯网 版权所有