●。。第十二章异常处理 大型和十分复杂的程序往往会产生一些很难查找的甚至是 无法避免的运行时错误。当发生运行时错误时,不能简单地结 束程序运行,而是退回到任务的起点,指出错误,并由用户决 定下一步工作。面向对象的异常处理( exception handling) 机制是C++语言用以解决这个问题的有力工具。 程序的错误有两种,一种是编译错误,即语法错误。如果 使用了错误的语法、函数、结构和类,程序就无法被生成运行 代码。另一种是在运行时发生的错误,它分为不可预料的逻辑 错误和可以预料的运行异常,这里所讲的异常( exception)是 程序可能检测到的,运行时不正常的情况,如存储空间耗尽 数组越界、被0除等等,可以预见可能发生在什么地方,但是无 法确知怎样发生和何时发生。特别在一个大型的程序(软件) 中,程序各部分是由不同的小组编写的,它们由公共接口连起 来,错误可能就发生在相互的配合上,也可能发生在事先根本 想不到的个别的条件组合上
第十二章 异常处理 大型和十分复杂的程序往往会产生一些很难查找的甚至是 无法避免的运行时错误。当发生运行时错误时,不能简单地结 束程序运行,而是退回到任务的起点,指出错误,并由用户决 定下一步工作。面向对象的异常处理(exception handling) 机制是C++语言用以解决这个问题的有力工具。 程序的错误有两种,一种是编译错误,即语法错误。如果 使用了错误的语法、函数、结构和类,程序就无法被生成运行 代码。另一种是在运行时发生的错误,它分为不可预料的逻辑 错误和可以预料的运行异常,这里所讲的异常(exception)是 程序可能检测到的,运行时不正常的情况,如存储空间耗尽、 数组越界、被0除等等,可以预见可能发生在什么地方,但是无 法确知怎样发生和何时发生。特别在一个大型的程序(软件) 中,程序各部分是由不同的小组编写的,它们由公共接口连起 来,错误可能就发生在相互的配合上,也可能发生在事先根本 想不到的个别的条件组合上
● 第十二章异常处理 为处理可预料的错误,常用的典型方法是让被调用函数返 回某一个特别的值(或将某个按引用调用传递的参数设置为 个特别的值),而外层的调用程序则检查这个错误标志,从而 确定是否产生了某一类型的错误。另一种典型方法是当错误发 生时跳出当前的函数体,控制转向某个专门的错误处理程序, 从而中断正常的控制流。这两种方法都是权宜之计,不能形成 强有力的结构化异常处理模式。 异常处理机制是用于管理程序运行期间错误的一种结构化 方法。所谓结构化是指程序的控制不会由于产生异常而随意跳 转。异常处理机制将程序中的正常处理代码与异常处理代码显 式区别开来,提高了程序的可读性 异常处理在C+编程中已经普遍采用,成为提高程序健壮 性的重要手段之一
第十二章 异常处理 为处理可预料的错误,常用的典型方法是让被调用函数返 回某一个特别的值(或将某个按引用调用传递的参数设置为一 个特别的值),而外层的调用程序则检查这个错误标志,从而 确定是否产生了某一类型的错误。另一种典型方法是当错误发 生时跳出当前的函数体,控制转向某个专门的错误处理程序, 从而中断正常的控制流。这两种方法都是权宜之计,不能形成 强有力的结构化异常处理模式。 异常处理机制是用于管理程序运行期间错误的一种结构化 方法。所谓结构化是指程序的控制不会由于产生异常而随意跳 转。异常处理机制将程序中的正常处理代码与异常处理代码显 式区别开来,提高了程序的可读性。 异常处理在C++编程中已经普遍采用,成为提高程序健壮 性的重要手段之一
12.1异常处的机制國回 C++语言异常处理机制的基本思想是将异常的检测与处 理分离。当在一个函数体中检测到异常条件存在,但无法确定 相应的处理方法时,将引发一个异常,并由函数的直接或间接 调用检测并处理这个异常。这一基本思想用3个保留字实现: throw、try和 catch。其作用是: (1)try:标识程序中异常语句块的开始。 (2) throy:用来创建用户自定义类型的异常错误。 (3) catch:标识异常错误处理模块的开始。 在C++程序中,任何需要检测异常的语句(包括函数调 用)都必须在try语句块中执行,异常必须由紧跟着try语句后 面的 catch语句来捕获并处理。因而,try与 catch总是结合使 用。thow、try和 catch语句的一般语法如下:
12.1 异常处理的机制 C++语言异常处理机制的基本思想是将异常的检测与处 理分离。当在一个函数体中检测到异常条件存在,但无法确定 相应的处理方法时,将引发一个异常,并由函数的直接或间接 调用检测并处理这个异常。这一基本思想用3个保留字实现: throw、try和catch。其作用是: (1)try:标识程序中异常语句块的开始。 (2)throw:用来创建用户自定义类型的异常错误。 (3)catch:标识异常错误处理模块的开始。 在C++程序中,任何需要检测异常的语句(包括函数调 用)都必须在try语句块中执行,异常必须由紧跟着try语句后 面的catch语句来捕获并处理。因而,try与catch总是结合使 用。throw、try和catch语句的一般语法如下:
●。。12.,1异常处理的机制 throw<表达式>; /try语句块 catch(类型1参数1) //针对类型1的异常处理 catch(类型2参数2) //针对类型2的异常处理 catch(类型n参数n) /针对类型n的异常处理
12.1 异常处理的机制 throw <表达式>; try { //try语句块 } catch(类型1 参数1) { //针对类型1的异常处理 } catch (类型2 参数2) { //针对类型2的异常处理 } … catch (类型n 参数n) { //针对类型n的异常处理 }
12.1异常处理的机制 ● 请看下面的程序段给出try块与 catch子句的关系: int maino inta9]={123456789},b[9]={0}i stack <int> stack 8) try t for(i=0; i<9; i++) stack, Push(a[iDi stack. PrintStackO; catch(pushOn Full <int>)t cerr<<"栈满”<<endl for(i=0; i<9; i++)cout<<b[]<<'ti cout<<endl 这里有一个try块,对应压栈的操作语句;也有一个 catch子句 ( catch clause),分别处理压栈时的栈满溢出的异常处理
12.1 异常处理的机制 请看下面的程序段给出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 <int> ) { cerr<<”栈满”<<endl; } for(i=0; i<9; i++) cout<<b[i]<<’\t’; cout<<endl; } 这里有一个try块,对应压栈的操作语句;也有一个catch子句 (catch clause),分别处理压栈时的栈满溢出的异常处理