版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、八、异常处理八、异常处理n程序中潜在的异常问题程序中潜在的异常问题n异常处理机制异常处理机制nC+C+中的异常处理中的异常处理n标准异常标准异常n使用异常处理应注意的几个问题使用异常处理应注意的几个问题【例】求解一元二次方程【例】求解一元二次方程ax2+bx+c=0ax2+bx+c=0#include#include#include#includeusing namespace std;using namespace std;int main()int main() float a,b,c;float a,b,c;double x1,x2;double x1,x2;coutcoutabc;ci
2、nabc;x1=(-b+sqrt(x1=(-b+sqrt(b b* *b-4b-4* *a a* *c c)/2)/2* *a;a;x2=(-b-sqrt(x2=(-b-sqrt(b b* *b-4b-4* *a a* *c c)/2)/2* *a;a;coutcout方程的实根是方程的实根是: x1=x1 x2=x2endl;: x1=x1 x2=x2endl;return 0;return 0; n问题的分析问题的分析n能够正常运行的程序可能存在很多潜在隐患。程序运行时可能够正常运行的程序可能存在很多潜在隐患。程序运行时可以检测到的一些非正常情况称为异常(以检测到的一些非正常情况称为异常(
3、ExceptionException)。如除数)。如除数为为0 0,数组越界访问,内存空间不够,输入输出不正常(文件,数组越界访问,内存空间不够,输入输出不正常(文件找不到、输入数据类型错等)等等。找不到、输入数据类型错等)等等。n异常是程序错误一种形式。异常是程序错误一种形式。n程序中的错误按性质可分为:程序中的错误按性质可分为:n语法错误语法错误( (关键字拼写错、标识符未定义、语句不完整等关键字拼写错、标识符未定义、语句不完整等) )n逻辑错误逻辑错误( (算法设计有误导致得不到期望结果算法设计有误导致得不到期望结果) )n异常异常( (出现是不可避免的,必须加以控制和处理出现是不可避免
4、的,必须加以控制和处理) )n需要进行异常处理,从而减少异常对程序运行的需要进行异常处理,从而减少异常对程序运行的影响,提高程序的容错性。影响,提高程序的容错性。n异常处理机制提供了系统层次上的标准设施,其异常处理机制提供了系统层次上的标准设施,其主要任务有以下几点:主要任务有以下几点:n能够在异常发生时,在执出点抛出异常,并将有关异常的信能够在异常发生时,在执出点抛出异常,并将有关异常的信息以类型的形式传递到异常处理模块;息以类型的形式传递到异常处理模块;n建立模块之间的异常通信机制,特别是在多层模块之间实现建立模块之间的异常通信机制,特别是在多层模块之间实现异常有序的传递,保证抛出的每个异
5、常都能被适当的异常处异常有序的传递,保证抛出的每个异常都能被适当的异常处理模块捕获。理模块捕获。n保证异常发生时能自动释放异常模块所占用的系统资源。保证异常发生时能自动释放异常模块所占用的系统资源。n对于不执行异常处理的代码没有任何额外的运行负担。对于不执行异常处理的代码没有任何额外的运行负担。n将异常处理代码从普通代码中分离出来。将异常处理代码从普通代码中分离出来。n 异常的抛出、检测和捕获异常的抛出、检测和捕获n 异常在多层模块间的传递异常在多层模块间的传递n 异常接口声明异常接口声明n 异常处理中析构函数的调用异常处理中析构函数的调用n 异常类的层次结构异常类的层次结构n异常抛出、检测和
6、捕获的语法定义如下:异常抛出、检测和捕获的语法定义如下:异常抛出:异常抛出:throw throw 表达式;表达式;异常的检测和捕获由异常的检测和捕获由try-catchtry-catch结构实现:结构实现:trytry 被检测可能会发生异常的语句被检测可能会发生异常的语句 catch(catch(异常的类型异常的类型) ) 异常处理的语句异常处理的语句 int main() int main() float a,b,c;float a,b,c;double x1,x2;double x1,x2;coutcoutabc;cinabc;trytry if(0 = a) if(0 = a) thr
7、ow athrow a;/ b;/ b并无意义,代表并无意义,代表floatfloat型即可型即可if(bif(b* *b-4b-4* *a a* *c)0) c)0) throw 1.0throw 1.0; ;x1=(-b+sqrt(bx1=(-b+sqrt(b* *b-4b-4* *a a* *c)/2c)/2* *b;b;x2=(-b-sqrt(bx2=(-b-sqrt(b* *b-4b-4* *a a* *c)/2c)/2* *b;b;coutcout方程的实根是方程的实根是: x1=x1 x2=x2endl;: x1=x1 x2=x2endl; catch(float)catch(f
8、loat)/捕获捕获floatfloat类型的异常类型的异常 cout cout系数系数b b不能为不能为0 0,方程无解,方程无解!endl; !endl; catch(double)catch(double)/捕获捕获doubledouble类型的异常类型的异常 cout cout开方为负值,方程无解开方为负值,方程无解!endl; !endl; coutcout程序结束程序结束!endl;!endl;return 0;return 0; 【例】函数嵌套情况下的异常处理【例】函数嵌套情况下的异常处理typedef struct zero/typedef struct zero/声明除数为零
9、异常类型声明除数为零异常类型string s;ZERO;string s;ZERO;typedef struct negative/typedef struct negative/声明开方值为负异常类型声明开方值为负异常类型string s;NEGATIVE;string s;NEGATIVE;fun2(int a,int b,int c)/fun2(int a,int b,int c)/抛出异常的函数抛出异常的函数 ZERO s1;NEGATIVE s2;ZERO s1;NEGATIVE s2; s1.s= s1.s=除数为零除数为零;s2.s=;s2.s=开方值为负数开方值为负数;if(0
10、 = a) if(0 = a) throw s1throw s1; ;if(bif(b* *b-4b-4* *a a* *c)0) c)0) throw s2throw s2; ;return sqrt(breturn sqrt(b* *b-4b-4* *a a* *c);c); fun1(int a,int b,int c) /fun1(int a,int b,int c) /捕获异常并重新抛出异常捕获异常并重新抛出异常trytry return (-b+fun2(a,b,c)/(2 return (-b+fun2(a,b,c)/(2* *a); a); catch(ZERO)catch(Z
11、ERO) throwthrow;/;/重新抛出异常重新抛出异常 int main() int main() float a,b,c;float a,b,c;coutcoutabc;cinabc;trytry cout cout方程的一个实根是方程的一个实根是: x1=fun1(a,b,c)endl; : x1=fun1(a,b,c)endl; catch(ZERO S1) /catch(ZERO S1) /捕获除数为零异常捕获除数为零异常, ,并处理异常并处理异常 coutS1.s coutS1.s,方程无解,方程无解!endl; !endl; catch(NEGATIVE S2)/ catc
12、h(NEGATIVE S2)/ 捕获开方值为负数异常捕获开方值为负数异常, ,并处理异常并处理异常 coutS2.s coutS2.s,方程无解,方程无解!endl; !endl; coutcout程序结束程序结束!endl;!endl;return 0;return 0; 异常处理开始本模块中是否有try-catch结构进行异常处理是否有匹配的catch子句catch子句是否重新抛出异常异常处理结束是否有上级模块(调用栈是否为空)是否有匹配的catch子句进行异常正理终止程序运行否是是否是是否是否否n在使用可能抛出异常的函数时,可能需要知道该在使用可能抛出异常的函数时,可能需要知道该函数抛出
13、的异常类型,函数抛出的异常类型,C+C+专门提供了异常接口专门提供了异常接口声明,也称为异常规范。声明,也称为异常规范。n其语法形式如下:其语法形式如下:函数类型函数类型 函数名函数名( (函数参数表函数参数表) ) throw (throw (异常类型表异常类型表) )n其中异常类型表包括该函数中所有可以抛出的异常类型,其中异常类型表包括该函数中所有可以抛出的异常类型,异常类型之间用逗号分开。异常类型之间用逗号分开。n异常接口声明是函数接口的一部分,是函数使用者和函数异常接口声明是函数接口的一部分,是函数使用者和函数之间的协议。之间的协议。#include #include using na
14、mespace std;using namespace std;void Fun( void );void Fun( void );class intArray class intArray public:public:intArray(int n) intArray(int n) p = new int n ; p = new int n ; coutcout构造构造intArrayintArray,分配具有,分配具有”n“n“个元素的数组。个元素的数组。 endl; endl; intArray() intArray() delete p;delete p;cout cout 析构析构in
15、tArrayintArray,释放资源。,释放资源。 endl; endl; private:private:int int * *p;p;void Fun() void Fun() intArray ia(10);intArray ia(10);cout cout 在在Fun()Fun()中抛掷整型异常。中抛掷整型异常。 endl; endl; throw 1; throw 1; int main() int main() try try cout cout 在主函数的在主函数的trytry块中调用函数块中调用函数Fun()Fun()。 endl; endl;Fun();Fun(); cat
16、ch( int ) catch( int ) cout cout 在主函数在主函数catchcatch子句捕获到整型异常子句捕获到整型异常, ;, ;cout cout 并进行异常处理。并进行异常处理。 endl; endl; cout cout 程序结束程序结束! endl;! endl;return 0;return 0; #include #include #include #include using namespace std;using namespace std;class Excp /class Excp /声明异常基类声明异常基类 public:public:static v
17、oid print( string msg )/ static void print( string msg )/ 打印错误信息打印错误信息 coutmsgendl; coutmsgendl; ;class pushOnFull : public Excp /class pushOnFull : public Excp /声明栈满异常类声明栈满异常类public:public:pushOnFull( int i ) : tempvalue( i ) pushOnFull( int i ) : tempvalue( i ) int getTempValue() return tempvalue;
18、 int getTempValue() return tempvalue; private:private:int tempvalue; /int tempvalue; /存放异常发生时没有压栈的值存放异常发生时没有压栈的值;class popOnEmpty : public Excp ;/class popOnEmpty : public Excp ;/声明栈空异常类声明栈空异常类 class newError : public Excp ; /class newError : public Excp ; /声明动态分配内存异常类声明动态分配内存异常类 class otherError :
19、public Excp ;/class otherError : public Excp ;/声明其它异常类声明其它异常类 class Stack class Stack public:public:Stack( int capacity=10 ) throw (newError);/Stack( int capacity=10 ) throw (newError);/建立一空栈建立一空栈Stack()delete elements;/Stack()delete elements;/析构函数,释放数组资源析构函数,释放数组资源void push( int value ) throw (push
20、OnFull);/void push( int value ) throw (pushOnFull);/压栈压栈void pop(int &top_value) throw (popOnEmpty);/void pop(int &top_value) throw (popOnEmpty);/出栈出栈bool isfull()return top maxsize? false : true;bool isfull()return top maxsize? false : true;bool isempty()return top ? false : true;bool isempty()retu
21、rn top ? false : true;int size() return top; int size() return top; void display();void display();private:private:int top;/int top;/栈顶指针栈顶指针int int * * elements;/ elements;/存放栈中元素的栈数组存放栈中元素的栈数组int maxsize;/int maxsize;/栈可容纳元素的个数栈可容纳元素的个数;Stack:Stack( int capacity):top(0), maxsize(capacity) Stack:Sta
22、ck( int capacity):top(0), maxsize(capacity) elements = new intcapacity; /elements = new intcapacity; /动态创建栈数组动态创建栈数组if(0=elements) throw newError();/if(0=elements) throw newError();/如果分配失败抛出异常如果分配失败抛出异常 void Stack:pop( int &top_value ) void Stack:pop( int &top_value ) if ( isempty() ) throw popOnEmp
23、ty();/if ( isempty() ) throw popOnEmpty();/栈空,则抛出异常栈空,则抛出异常top_value = elements -top ;top_value = elements -top ; void Stack:push( int value ) void Stack:push( int value ) if ( isfull() )if ( isfull() )throw pushOnFull(value);/throw pushOnFull(value);/栈满抛出异常栈满抛出异常elementstop+ = value;elementstop+ =
24、value; void Stack:display() void Stack:display() if ( !size() )if ( !size() ) cout cout 栈中已没有元素!栈中已没有元素!n; return; n; return; cout (cout (栈中有栈中有 size() size() 个元素个元素)( bottom: ;)( bottom: ;for ( int i = 0; i top; +i )for ( int i = 0; i top; +i )cout elementsi ;cout elementsi ;cout :top )n;cout :top
25、)n; int main() int main() int i,n,count;int i,n,count;try try cout cout n;cin n;Stack myStack(n);Stack myStack(n);cout cout n;cin n;for ( i = 1; i = n; count=+i )for ( i = 1; i = n; count=+i )myStack.push( i );myStack.push( i );myStack.display();myStack.display();cout cout n;cin n;for ( i = 1; i = n
26、; count=i+ )for ( i = 1; i = n; count=i+ ) int x; int x;myStack.pop( x );myStack.pop( x ); cout cout 已出栈已出栈countcount个元素个元素!n;!n; catch(pushOnFull e) catch(pushOnFull e) e.print(e.print(栈已满!栈已满!););cout cout 栈中有栈中有count-1count-1个元素个元素,;,;coutcout值为值为e.getTempValue()e.getTempValue()的元素没有压入栈的元素没有压入栈n;
27、n; catch(newError)catch(newError) newError:print( newError:print(给栈分配空间时出错!给栈分配空间时出错!); ); catch(popOnEmpty) catch(popOnEmpty) cout cout 已出栈已出栈countcount个元素个元素,;,;popOnEmpty:print(popOnEmpty:print(栈已空!栈已空!);); catch(Excp)catch(Excp) Excp:print( Excp:print(程序其它异常在此处理!程序其它异常在此处理!); ); return 0;return
28、0; nC+C+标准库提供的标准异常类的层次结构标准库提供的标准异常类的层次结构 exceptionlogic_errorruntime_errorbad_allocbad_exceptionbad_castbad_typeidios_base:failurelength_errordomain_errorout_of_rangeinvalid:argumentrange_erroroverflow_errorunderflow:errorn标准异常的根是标准异常的根是exceptionexception类类 ,其声明如下:,其声明如下:namespace std /exception nam
29、espace std /exception 类在命名空间类在命名空间std std 中中class exception class exception public:public:exception() throw();/exception() throw();/缺省构造函数缺省构造函数exception( const exception & ) throw();/exception( const exception & ) throw();/拷贝构造函数拷贝构造函数exception& operator=( const exception& ) throw(); exception& ope
30、rator=( const exception& ) throw(); virtual exception() throw();/virtual exception() throw();/析构函数析构函数/ what()/ what()返回一个字符串,用于异常的文本描述。返回一个字符串,用于异常的文本描述。 virtual const charvirtual const char* * what() const throw(); what() const throw(); n标准异常的使用标准异常的使用#include/#include/标准异常的头文件标准异常的头文件#include#inc
31、lude#include#includeusing namespace std;using namespace std;class Array class Array public:public:Array(const char Array(const char * *source, int sz) source, int sz) size = sz; size = sz; ca = new charsize; ca = new charsize; for ( int i = 0; i size; +i ) for ( int i = 0; i size; +i )if ( !source )
32、if ( !source ) cai = 0; cai = 0;elseelse cai = sourcei; cai = sourcei; char &operator( int i ) const char &operator( int i ) const if ( i = size ) if ( i = size ) string es =string es =数组越界!数组越界!;throw out_of_range( es );throw out_of_range( es ); / /将将eses字符串传入对象字符串传入对象 return cai; return cai; priva
33、te:private:int size;int size;char char * *ca;ca;int main() int main() try try char ca = A,B,C,D,E,F; char ca = A,B,C,D,E,F; Array CA( ca, sizeof(ca)/sizeof(char) ); Array CA( ca, sizeof(ca)/sizeof(char) ); CA5=X;/ CA5=X;/正常访问字符数组类正常访问字符数组类 CA6=G;/CA6=G;/越界访问数组类将引发异常越界访问数组类将引发异常 return 0;return 0; ca
34、tch ( catch ( const out_of_range &excpconst out_of_range &excp ) ) cout excp.what()endl;/ cout excp.what()endl;/获取异常信息获取异常信息 return -1;return -1; n在在C+C+的程序设计中,异常处理应主要用于独立的程序设计中,异常处理应主要用于独立开发的程序模块之间的异常通信。开发的程序模块之间的异常通信。n异常处理机制的使用会影响程序的执行效率。因此异常处理机制的使用会影响程序的执行效率。因此,即使,即使C+C+支持异常处理,在程序设计时也应该具体支持异常处理,在程序设计时也应该具体情况具体分析。在设计一个模块时,如果该模块发情况具
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年哈尔滨市香坊区工会人员招聘考试备考题库及答案详解
- 2026年鹤岗市工农区政务服务中心(窗口人员)招聘考试模拟试题及答案详解
- 2026年鹤壁市鹤山区政务服务中心(窗口人员)招聘笔试参考试题及答案详解
- 2026年福建省宁德市工会人员招聘考试备考试题及答案详解
- 2026年贵阳市小河区医疗系统事业编人员招聘笔试备考题库及答案详解
- 2026年甘肃天水清水县城区中小学选调教师73人考试模拟试题及答案详解
- 2026年广西壮族自治区崇左市医疗系统事业编人员招聘笔试备考题库及答案详解
- 2026年陕西省政务服务中心(窗口人员)招聘考试备考题库及答案详解
- 2026年四平市铁东区医疗系统事业编人员招聘笔试备考题库及答案详解
- 2026年广东省揭阳市医疗系统事业编人员招聘笔试参考题库及答案详解
- 电焊机安全技术与防护措施培训
- 中暑急救新进展与新技术
- 老年人安全防护知识普及
- 2026年气象局机关遴选公务员面试题
- 平安集团采购制度
- 2026版病历书写规范解读(院内培训课件)
- 老年护理中的医疗与养老融合实践
- 村保洁人员考核奖惩制度
- 军训教官量化考核制度
- LNG加气站安全操作规程标准
- 电工高级工培训
评论
0/150
提交评论