C++中try_catch_throw的做异常处理用法

上传人:飞*** 文档编号:40227079 上传时间:2018-05-24 格式:DOC 页数:5 大小:49KB
返回 下载 相关 举报
C++中try_catch_throw的做异常处理用法_第1页
第1页 / 共5页
C++中try_catch_throw的做异常处理用法_第2页
第2页 / 共5页
C++中try_catch_throw的做异常处理用法_第3页
第3页 / 共5页
C++中try_catch_throw的做异常处理用法_第4页
第4页 / 共5页
C++中try_catch_throw的做异常处理用法_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《C++中try_catch_throw的做异常处理用法》由会员分享,可在线阅读,更多相关《C++中try_catch_throw的做异常处理用法(5页珍藏版)》请在金锄头文库上搜索。

1、C+中异常处理的语法中异常处理的语法关键字 1、try 2、catch 3、throw 其中关键字 try 表示定义一个受到监控、受到保护的程序代码块;关键字 catch 与 try 遥相呼应,定义当 try block(受监控的程序块)出现异常时,错误处理的程序模块,并且 每个 catch block 都带一个参数(类似于函数定义时的数那样) ,这个参数的数据类型用于 异常对象的数据类型进行匹配;而 throw 则是检测到一个异常错误发生后向 外抛出一个异 常事件,通知对应的 catch 程序块执行对应的错误处理。 语法 1、 还是给一个例子吧!如下:int main() cout “In

2、main.“ endl; /定义一个 try block,它是用一对花括号所括起来的块作用域的代码块 try cout “在 try block 中, 准备抛出一个异常.“ endl; /这里抛出一个异常(其中异常对象的数据类型是 int,值为 1) /由于在 try block 中的代码是受到监控保护的,所以抛出异常后,程序的 /控制流便转到随后的 catch block 中 throw 1; cout “在 try block 中, 由于前面抛出了一个异常,因此这里的代码 是不会得以执行到的“ endl; /这里必须相对应地,至少定义一个 catch block,同样它也是用花括号括起 来

3、的 catch( int cout “Back in main. Execution resumes here.“ endl; return 0; 2、语法很简单吧!的确如此。另外一个 try block 可以有多个对应的 catch block,可为什么要多个 catch block 呢?这是因为每个 catch block 匹配一种类型的 异常错误对象的处理,多个 catch block 呢就可以针对不同的异常错误类型分别处理。 毕竟异常错误也是分级别的呀!有致命的、有一般的、有警告的,甚至还有的只是 事件通知。例子如下:int main() try cout “在 try block 中

4、, 准备抛出一个 int 数据类型的异常.“ endl; throw 1; cout “在 try block 中, 准备抛出一个 double 数据类型的异常.“ endl; throw 0.5; catch( int catch( double return 0; 3、一个函数中可以有多个 trycatch 结构块,例子如下: int main() try cout “在 try block 中, 准备抛出一个 int 数据类型的异常.“ endl; throw 1; catch( int /这里是二个 trycatch 结构块,当然也可以有第三、第四个,甚至更多 try cout “在

5、try block 中, 准备抛出一个 double 数据类型的异常.“ endl; throw 0.5; catch( double return 0; 4、上面提到一个 try block 可以有多个对应的 catch block,这样便于不同的 异常错误分类处理,其实这只是异常错误分类处理的方法之一(暂且把它叫做横向展开的吧!) 。另外还有一种就是纵向的,也即是分 层的、trycatch 块是可以嵌套的, 当在低层的 trycatch 结构块中不能匹配到相同类型的 catch block 时,它就会到上层 的 trycatch 块中去寻找匹配到正确的 catch block 异常处理模块

6、。例程如下: int main() try /这里是嵌套的 trycatch 结构块 try cout “在 try block 中, 准备抛出一个 int 数据类型的异常.“ endl; throw 1; catch( int cout “在 try block 中, 准备抛出一个 double 数据类型的异常.“ endl; throw 0.5; catch( double return 0; 5、讲到是 trycatch 块是可以嵌套分层的,并且通过异常对象的数据类型来进行匹配, 以找到正确的 catch block 异常错误处理代码。这里就不得不详细叙述一下通过异常对象 的数据类型来进

7、行匹配找到正确的 catch block 的过程。 (1) 首先在抛出异常的 trycatch 块中查找 catch block,按顺序先是与第一个 catch block 块匹配,如果抛出的异常对象的数据类型与 catch block 中传入的异常对象的临时变 量(就是 catch 语句后面参数)的数据类型完全相同,或是它的子类型对象,则匹配成功, 进入到 catch block 中执行;否则到二步; (2) 如果有二个或更多的 catch block,则继续查找匹配第二个、第三个,乃至最 后一个 catch block,如匹配成功,则进入到对应的 catch block 中执行;否则到三步

8、; (3) 返回到上一级的 trycatch 块中,按规则继续查找对应的 catch block。如果找到, 进入到对应的 catch block 中执行;否则到四步; (4) 再到上上级的 trycatch 块中,如此不断递归,直到匹配到顶级的 trycatch 块中的 最后一个 catch block,如果找到,进入到对应的 catch block 中执行;否则程序将会执行 terminate()退出。 另外分层嵌套的 trycatch 块是可以跨越函数作用域的,例程如下: void Func() throw() /这里实际上也是嵌套在里层的 trycatch 结构块 try cout “

9、在 try block 中, 准备抛出一个 int 数据类型的异常.“ endl; /由于这个 trycatch 块中不能找到匹配的 catch block,所以 /它会继续查找到调用这个函数的上层函数的 trycatch 块。 throw 1; catch( float int main() try Func(); cout “在 try block 中, 准备抛出一个 double 数据类型的异常.“ endl; throw 0.5; catch( double catch( int return 0; 6、刚才提到,嵌套的 trycatch 块是可以跨越函数作用域的,其实这里面还有另外一

10、层 涵义,就是抛出异常对象的函数中并不一定必须存在 trycatch 块,它可以是调用这个函数 的上层函数中存在 trycatch 块,这样这个函数的代码也同样是受保护、受监控的代码;当 然即便是上层调用函 数不存在 trycatch 块,也只是不能找到处理这类异常对象错误处理的 catch block 而已,例程如下:void Func() throw() /这里实际上也是嵌套在里层的 trycatch 结构块 /由于这个函数中是没有 trycatch 块的,所以它会查找到调用这个函数的上 /层函数的 trycatch 块中。 throw 1; int main() try /调用函数,注意

11、这个函数里面抛出一个异常对象 Func(); cout “在 try block 中, 准备抛出一个 double 数据类型的异常.“ endl; throw 0.5; catch( double catch( int /如果这里调用这个函数,那么由于 main()已经是调用栈的顶层函数,因此不能 找 /到对应的 catch block,所以程序会执行 terminate()退出。Func(); / 特别提示:在 C+标准中规定,可以在程序任何地方 throw 一个异常对象, / 并不要求一定只能是在受到 try block 监控保护的作用域中才能抛出异常,但 / 如果在程序中出现了抛出的找不到对应 catch block 的异常对象时,C+标 / 准中规定要求系统必须执行 terminate()来终止程序。 / 因此这个例程是可以编译通过的,但运行时却会异常终止。这往往给软件 / 系统带来了不安全性。与此形成对比的是 java 中提供的异常处理模型却是不 / 永许出现这样的找不到对应 catch block 的异常对象,它在编译时就给出错误 / 提示,所以 java 中提供的异常处理模型往往比 C+要更完善,后面的章节 / 会进一步对这两种异常处理模型进行一个详细的分析比较。return 0;

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号