C中异常处理的语法trycatchthrow-大漠一抹云樊书林-博客园_第1页
C中异常处理的语法trycatchthrow-大漠一抹云樊书林-博客园_第2页
C中异常处理的语法trycatchthrow-大漠一抹云樊书林-博客园_第3页
C中异常处理的语法trycatchthrow-大漠一抹云樊书林-博客园_第4页
C中异常处理的语法trycatchthrow-大漠一抹云樊书林-博客园_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、C 中异常处理的语法 try catch throw - 大漠一抹云 樊书林- 博客园C+ 中异常处理的语法关键字1、try2、catch3、throw其中关键字 try 表示定义一个受到监控、受到保护的程序代 码块;关键字 catch 与 try 遥相呼应,定义当 tryblock (受监控的程序块)出现异常时,错误处理的程序模块,并且每个 catchblock 都带一个参数(类似于函数定义时的数那样),这个参数的数据类型用于异常对象的数据类型进行匹配;而 throw 则是检测到一个异常错误发生后向 外抛出一个异常事件,通知对应的 catch 程序块执行对应的 错误处理。语法1、还是给一个例

2、子吧!如下:int main()cout << In main. << endl;/定义一个 try block ,它是用一对花括号 所括起来的块 作用域的代码块trycout << 在 try block 中 , 准备抛出一个异常 . << endl;/这里抛出一个异常(其中异常对象的数据类型是int ,值为 1 )/由于在 try block 中的代码是受到监控保护的,所以抛 出异常后,程序的/控制流便转到随后的 catch block 中throw 1;cout << 在 try block 中 , 由于前面抛出了一 个异常,因

3、此这里的代码是不会得以执行到的 << endl;/这里必须相对应地,至少定义一个catch block ,同样它也是用花括号括起来的catch( int& value )cout << 在 catch block 中 , 处理异常错误。 异常对象 value 的值为: << value << endl;cout << Back in main. Execution resumes here. << endl;return 0;2、语法很简单吧!的确如此。另外一个 try block 可以有 多个对应的 catch

4、block ,可为什么要多个 catch block 呢?这是因为每个 catch block 匹配一种类型的异常 错误对象的处理,多个 catch block 呢就可以针对不同的异常错误类型分别处理。毕竟异 常错误也是分级别的呀!有致命的、有一般的、有警告的, 甚至还有的只是事件通知。例子如下:int main()inttrycout<< 在 catchblock中,int 数据类型处理异常错误。 <<endl;catch( double& dvaluecout << 在 catch block中,double 数据类cout <<在t

5、ryblock中 , 准备抛出一个数据类型的异常. <<endl;throw 1;cout <<在tryblock中 , 准备抛出一个double 数据类型的异常H<<endl;throw 0.5;catch( int&value)型处理异常错误。 << endl;return 0;3、一个函数中可以有多个 trycatch 结构块,例子如下:int main()trycout << 在 try block 中 , 准备抛出一个 int 数据类型的异常 . << endl;throw 1;catch( int&am

6、p; value )cout << 在 catch block 中 , int 数据类型处 理异常错误。 << endl;/这里是二个 trycatch 结构块,当然也可以有第三、第四 个,甚至更多trycout << 在 try block 中 , 准备抛出一个 double 数据类型的异常 . << endl;throw 0.5;catch( double& d_value )cout << 在 catch block 中 , double 数据类 型处理异常错误。 << endl;return 0;4、上面提

7、到一个 try block 可以有多个对应的 catch block ,这样便于不同的异常错误分类处理, 其实这只是异常 错误分类处理的方法之一(暂且把它叫做横向展开的吧! ) 另外还有一种就是纵向的,也即是分层的、 trycatch 块是可以嵌套的,当在低层的 trycatch 结构 块中不能匹配到相同类型的 catchblock 时,它就会到上层的 trycatch 块中去寻找匹配到正确的 catch block 异常处理模块。例程如下:int main()try/这里是嵌套的 trycatch 结构块trycout << 在 try block 中 , 准备抛出一个 int数

8、据类型的异常 . << endl;throw 1;catch( int& value )cout << 在 catch block 中 , int 数据类型处 理异常错误。 << endl;cout<< 在 tryblock中 , 准备抛出一个double 数据类型的异常 .<<endl;throw catch(0.5;double&d_value)cout << 在 catch block 中 , double 数据类 型处理异常错误。 << endl; return 0;5、讲到是 tryc

9、atch 块是可以嵌套分层的,并且通过 异常对象的数据类型来进行匹配,以找到正确的 catch block 异常错误处理代码。这里就不得不详细叙述一下通过 异常对象的数据类型来进行匹配找到正确的 catch block 的过程。(1 ) 首先在抛出异常的 trycatch 块中查找 catch block , 按顺序先是与第一个 catchblock 块匹配,如果抛出的异常对象的数据类型与 catch block 中传入的异常对象的临时变量(就是 catch 语句后面 参数)的数据类型完全相同,或是它的子类型对象,则匹配 成功,进入到 catchblock 中执行;否则到二步;( 2) 如果有

10、二个或更多的 catch block ,则继 续查找匹配第二个、第三个,乃至最后一个 catch block , 如匹配成功, 则进入到对应的 catch block 中执行; 否则到 三步;3) 返回到上一级的 trycatch 块中,按规则继 续查找对应的 catch block 。如果找到, 进入到对应的 catch block 中执行;否则到四步;( 4) 再到上上级的 trycatch 块中,如此不断递 归,直到匹配到顶级的 trycatch 块中的最后一个 catch block ,如果找到,进入到对应的 catch block 中执行;否 则程序将会执行 terminate()

11、退出。另外分层嵌套的 trycatch 块是可以跨越函数作用域的, 例程如下:void Func() throw()/这里实际上也是嵌套在里层的 trycatch 结构块trycout << 在 try block 中 , 准备抛出一个 int 数据类型的异常 . << endl;/由于这个 trycatch 块中不能找到匹配的 catch block , 所以/它会继续查找到调用这个函数的上层函数的 trycatch 块。 throw 1;catch( float& value )cout << 在 catch block 中 , int 数据类型

12、处 理异常错误。 << endl;int main()tryFunc();cout<< 在 tryblock中 , 准备抛出一个double 数据类型的异常 .<<endl;throw catch(0.5;double&d_value)cout << 在 catch block 中 , double 数据类 型处理异常错误。 << endl;catch( int& value )/这个例子中, Func() 函数中抛出的异常会在此被处理cout << 在 catch block 中 , int 数据类型处

13、理异常错误。 << endl;return 0;6、刚才提到, 嵌套的 trycatch 块是可以跨越函数作用域的, 其实这里面还有另外一层涵义,就是抛出异常对象的函数中 并不一定必须存在trycatch 块,它可以是调用这个函数的上层函数中存在 trycatch 块,这样这个函数的代码也同样是受保护、受监控 的代码;当然即便是上层调用函数不存在 trycatch 块,也只是不能找到处理这类异常对象错 误处理的 catch block 而已,例程如下:void Func() throw()/这里实际上也是嵌套在里层的 trycatch 结构块/由于这个函数中是没有 trycatch

14、 块的,所以它会查找到 调用这个函数的上/层函数的 trycatch 块中。throw 1;int main()try/调用函数,注意这个函数里面抛出一个异常对象Func();cout<< 在 tryblock中 , 准备抛出一个double 数据类型的异常 .<<endl;throw catch(0.5;double&d_value)cout << 在 catch block 中 , double 数据类 型处理异常错误。 << endl;catch( int& value )/这个例子中, Func() 函数中抛出的异常会在此被处理cout << 在 catch block 中 , int 数据类型处理异常错误。 << endl;/如果这里调用这个函数,那么由于 main() 已经是调用栈 的顶层函数,因此不能找/到对应的 catch block ,所以程序会执行 terminate() 退 出。Func();/ 特别提示 :在 C+ 标准中规定, 可以在程序任何地方throw 一个异常对象,/ 并不要求一定只能是在受到 try block 监控保护的作 用域中才能抛出异常,但/ 如果在程序中出现了抛出的找不到对应 catch block 的异常对象时,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论