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 <int>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 <int>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 <typename T>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 <typename T>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<T> 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<T> eObj){ cerr<<”栈满”<<eObj.value()<<”未压入栈”<<endl; return 1; } 在catch子句的异常声明中声明了对象eObj,用它来调用pushOnFull类 的对象成员函数value()。异常对象是在抛出点被创建,与catch子句是否显 式要求创建一个异常对象无关,该对象总是存在,在catch子句中只是为了调 用异常处理对象的成员函数才声明为对象,不用类