




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C+中异常处理的语法 try catch throwC+中异常处理的语法。关键字1、 try2、 catch3、 throw其中关键字try表示定义一个受到监控、受到保护的程序代码块;关键字catch与try遥相呼应,定义当try block(受监控的程序块)出现异常时,错误处理的程序模块,并且每个catch block都带一个参数(类似于函数定义时的数那样),这个参数的数据类型用于异常对象的数据类型进行匹配;而throw则是检测到一个异常错误发生后向外抛出一个异常事件,通知对应的catch程序块执行对应的错误处理。语法1、还是给一个例子吧!如下:int main(cout <<
2、"In main." << endl;/定义一个try block,它是用一对花括号所括起来的块作用域的代码块trycout << "在 try block 中, 准备抛出一个异常." << endl;/这里抛出一个异常(其中异常对象的数据类型是int,值为1)/由于在try block中的代码是受到监控保护的,所以抛出异常后,程序的/控制流便转到随后的catch block中throw 1;cout << "在 try block 中, 由于前面抛出了一个异常,因此这里的代码是不会得以执行到的&
3、quot; << 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可以有多个对应的cat
4、ch block,可为什么要多个catch block呢?这是因为每个catch block匹配一种类型的异常错误对象的处理,多个catch block呢就可以针对不同的异常错误类型分别处理。毕竟异常错误也是分级别的呀!有致命的、有一般的、有警告的,甚至还有的只是事件通知。例子如下:int main(trycout << "在 try block 中, 准备抛出一个int数据类型的异常." << endl;throw 1;cout << "在 try block 中, 准备抛出一个double数据类型的异常." <
5、;< endl;throw 0.5;catch( int& value cout << "在 catch block 中, int数据类型处理异常错误。”<< endl;catch( double& d_value cout << "在 catch block 中, double数据类型处理异常错误。”<< endl;return 0;3、一个函数中可以有多个trycatch结构块,例子如下:int main(trycout << "在 try block 中, 准备抛出一个int数
6、据类型的异常." << endl;throw 1;catch( int& value cout << "在 catch block 中, int数据类型处理异常错误。”<< endl;/这里是二个trycatch结构块,当然也可以有第三、第四个,甚至更多trycout << "在 try block 中, 准备抛出一个double数据类型的异常." << endl;throw 0.5;catch( double& d_value cout << "在 cat
7、ch block 中, double数据类型处理异常错误。”<< endl;return 0;4、上面提到一个try block可以有多个对应的catch block,这样便于不同的异常错误分类处理,其实这只是异常错误分类处理的方法之一(暂且把它叫做横向展开的吧!)。另外还有一种就是纵向的,也即是分层的、trycatch块是可以嵌套的,当在低层的trycatch结构块中不能匹配到相同类型的catch block时,它就会到上层的trycatch块中去寻找匹配到正确的catch block异常处理模块。例程如下:int main(try/这里是嵌套的trycatch结构块trycou
8、t << "在 try block 中, 准备抛出一个int数据类型的异常." << endl;throw 1;catch( int& value cout << "在 catch block 中, int数据类型处理异常错误。”<< endl;cout << "在 try block 中, 准备抛出一个double数据类型的异常." << endl;throw 0.5;catch( double& d_value cout << "在
9、 catch block 中, double数据类型处理异常错误。”<< endl;return 0;5、讲到是trycatch块是可以嵌套分层的,并且通过异常对象的数据类型来进行匹配,以找到正确的catch block异常错误处理代码。这里就不得不详细叙述一下通过异常对象的数据类型来进行匹配找到正确的catch block的过程。(1) 首先在抛出异常的trycatch块中查找catch block,按顺序先是与第一个catch block块匹配,如果抛出的异常对象的数据类型与catch block中传入的异常对象的临时变量(就是catch语句后面参数)的数据类型完全相同,或是它
10、的子类型对象,则匹配成功,进入到catch block中执行;否则到二步; (2) 如果有二个或更多的catch block,则继续查找匹配第二个、第三个,乃至最后一个catch block,如匹配成功,则进入到对应的catch block中执行;否则到三步; (3) 返回到上一级的trycatch块中,按规则继续查找对应的catch block。如果找到,进入到对应的catch block中执行;否则到四步; (4) 再到上上级的trycatch块中,如此不断递归,直到匹配到顶级的trycatch块中的最后一个catch block,如果找到,进入到对应的catch block中执行;否则程
11、序将会执行terminate(退出。另外分层嵌套的trycatch块是可以跨越函数作用域的,例程如下:void Func( throw(/这里实际上也是嵌套在里层的trycatch结构块trycout << "在 try block 中, 准备抛出一个int数据类型的异常." << endl;/由于这个trycatch块中不能找到匹配的catch block,所以/它会继续查找到调用这个函数的上层函数的trycatch块。throw 1;catch( float& value cout << "在 catch block
12、 中, int数据类型处理异常错误。”<< endl;int main(tryFunc(;cout << "在 try block 中, 准备抛出一个double数据类型的异常." << endl;throw 0.5;catch( double& d_value cout << "在 catch block 中, double数据类型处理异常错误。”<< endl;catch( int& value /这个例子中,Func(函数中抛出的异常会在此被处理cout << "
13、;在 catch block 中, int数据类型处理异常错误。”<< endl;return 0;6、刚才提到,嵌套的trycatch块是可以跨越函数作用域的,其实这里面还有另外一层涵义,就是抛出异常对象的函数中并不一定必须存在trycatch块,它可以是调用这个函数的上层函数中存在trycatch块,这样这个函数的代码也同样是受保护、受监控的代码;当然即便是上层调用函数不存在trycatch块,也只是不能找到处理这类异常对象错误处理的catch block而已,例程如下:void Func( throw(/这里实际上也是嵌套在里层的trycatch结构块/由于这个函数中是没有t
14、rycatch块的,所以它会查找到调用这个函数的上/层函数的trycatch块中。throw 1;int main(try/调用函数,注意这个函数里面抛出一个异常对象Func(;cout << "在 try block 中, 准备抛出一个double数据类型的异常." << endl;throw 0.5;catch( 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监控保护的作用域中才能抛出异常,但/ 如果在程序中出现了抛出的找不到对应ca
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 新能源汽车产业协同发展策略试题及答案
- 小学教师如何提升反思能力的途径试题及答案
- 大学物理研究现状试题及答案
- 教师反思与改进教育教学的策略试题
- 教师教育教学反思与执行力的试题
- 建筑施工安全工程师考题与解答
- 新能源汽车操作安全与注意事项试题及答案
- 如何通过家具设计促进家庭和谐与生活质量提升试题及答案
- 山西省图书馆招聘考试真题2024
- 2024年湖北省卫生健康委直属事业单位考试真题
- 2023年上海等级考政治试卷及答案
- GB/T 5018-2008润滑脂防腐蚀性试验法
- GB/T 12221-2005金属阀门结构长度
- 中国近代史纲要(完整版)
- 音乐课件-《渴望春天》
- 中医基础理论知识培训课件
- HIAC8000A颗粒度计数器操作中文说明书新
- 高铁接触网维修岗位培训教材
- 动静脉内瘘的穿刺与护理-PPT课件
- 浙江省交通投资集团有限公司高速公路涉路作业安全管理操作细则
- 弃货声明格式(共2页)
评论
0/150
提交评论