第十章异常处理 编写大型和十分复杂的程序,往往会产生· 些很难查找的错误。面向对象的异常处理 ( 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 <typename T>void Stack<T>: Push(const T&datat f(fu() throw pushon Fu( T data);//注意加了括号是构造一个无名对象 elements[++top]=data template <typename T>T stack<T>: Popo if(empty o throw poponEmptyo return elements[top--li 注意 pushOn Ful是类,C++要求抛出的必须是对象,所以必须有“()”,这样是调用构造函 数建立一个对象。异常并非总是类对象, throw表达式也可以抛出任何类型的对象,如枚举 整数等等。 throw表达式为异常处理的第一步
10.2 异常处理的机制 首先,在C++中异常往往用类(class)来实现,异常类的声明如下: class popOnEmpty{...}; class pushOnFull{...}; template <typename T>void Stack<T>::Push(const T&data){ if(full()) throw pushOnFull(T data);//注意加了括号,是构造一个无名对象 elements[++top]=data; } template<typename T>T stack<T>::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 <int>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; stack<int>istack(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; }