VC程序处理---异常处理
VC程序处理---异常处理浙大课程教程
第十章 异常处理
引言:一个好的程序应该能对多种不同的特殊情况,做出不同的反应,对于突发情况也应有对应的处理方法。我们在编程时应考虑到各种突发情况,并在程序中给出解决方案,使程序的健壮性增强。 假设有一个司机从A地开车前往B地。若在某处有一岔路口,一般选择左边,路程会近一些。但当司机选择左边,将车开到途中时发现正在修路(突发情况),无法通过。这时,司机就会掉头回到刚才的岔路口处,重新选择右边的路,继续前进。
我们所编的程序也应该像这样,有一定的智能化的设计。这就要求在编写程序时,应该试着确定程序可能出现的错运,然后加入处理错误的代码。例如:当程序执行文件I/0操作时,应测试文件打开以及读写操作是否成功,并且在出现错误时做出正确的反应。随着程序复杂性的增加,为处理错误而必须包括在程序中代码的复杂性也相应地增加了。
为使程序更易于测试和处理错误,C++实现了异常处理机制。本章介绍了C++异常处理。程序使用try、throw和catch语句来支持异常处理。
10.1 异常概念 1.异常的概念
程序的错误,一种是编译错误,即语法错误。如果使用了错误的语法、函数、结构和类,程序就无法被生成运行代码。另一种是在运行时发生的错误,它分为不可预料的逻辑错误和可以预料的运行异常。
运行异常,可以预料,但不能避免,它是由系统运行环境造成的。如,内存空间不足,而程序运行中提出内存分配申请时,得不到满足,就会发生异常: #include<fstream.h> //……
void f(char *str) {
if stream source(str); //打开str串中的文件 if(source.fail()) //打不开
{cerr <<"Error opening the file:"<<str <<endl; exit(1); //退出程序 } //…… }
当程序对文件打不开时,程序会打印提示信息,并由exit(1)函数退出。这样就不至于会因为文件打不开而导致整个程序在运行过程中停滞或错乱. 2.异常的基本思想
在小型程序中,一旦发生异常,一般是将程序立即中断运行,从而无条件释放所有资源。对于大型程序来说,运行中一旦发生异常,应该允许恢复和继续运行。
恢复的过程就是把产生异常所造成的恶劣影响去掉,中间可能要涉及一系列
VC程序处理---异常处理浙大课程教程
的函数调用链的退栈,对象的析构,资源的释放等。继续运行就是异常处理之后,在紧接着异常处理的代码区域中继续运行。
在C++中,异常是指从发生问题的代码区域传递到处理问题的代码区域的一
常后,函数k()和g()都退栈,然后程序在函数f()中继续运行。如果不用异常处理机制,在程序中单纯地嵌入错误处理语句,要实现这一目的是艰难的。
异常的基本思想是:
(1)实际的资源分配(如内存申请或文件打开)通常在程序的低层进行,如图中的k()。
(2)当操作失败、无法分配内存或无法打开一个文件时.在逻辑上如何进行处理通常是在程序的高层,如图中的f(),中间还可能有与用户的对话。 (3)异常为从分配资源的代码转向处理错误状态的代码提供了一种表达方式。如果还存在中间层次的函数,如图中的g(),则为它们释放所分配的内存提供了机会,但这并不包括用于传递错误状态信息的代码。 从中可以看出,C什异常处理的目的,是在异常发生时,尽可能地减小破坏,周密地善后,而不去影响其它部分程序的运行。-这在大型程序中是非常必要的。 例如对于以前所讲的程序调用关系,如处理文件打开失败异常的方法,那么,异常只能在发生的函数k()中进行处理,无法直接传递到函数f()中,而且调用链中的函数g()的善后处理也十分困难。
10.2异常的实现
使用异常的步骤是:
(1)定义异常(try语句块) 将那些可能产生错误的语句框定在try语句中; (2)定义异常处理(catch语句块)
将异常处理的语句放在catch块中,以便异常被传递过来时就处理它; (3)抛掷异常(throw语句)
检测是否产生异常,若产生异常,则抛掷异常。
例如,下面的程序,设置了防备文件打不开的异常:
例题10-1
#include <fstream.h> #include <iostream.h> #include <stdlib.h>
VC程序处理---异常处理浙大课程教程
void main(int argc,char **argv)
{ ifstream source(argv[1]); //打开文件 char line[128]; try {
if(source.fail()) //如果打开失败 throw argv[1]; }
catch (char *s) {
cout<<"error opening the file"<<s<<endl; exit(1); }
while(!source.eof())
{ source.getline(line,sizeof(line)); cout<<line<<endl; }
source.close(); }
运行结果:
假定C盘中没有abc.txt文件,有xyz.txt文件, 内容为: How are you? Fine!两行语句, 则运行结果为:
在c:\>提示符后输入命令 ch10_1 abc.txt
屏幕显示结果为: error opening the file abc.txt
若输入命令 ch10_1 xyz.txt则屏幕显示结果为: How are you? Fine! 例题10-2:一个除零异常: #include<iostream.h> double Div(double,double); void main()
{ try { cout<<"7.3/2.0="<<Div(7.3,2.0)<<endl; cout<<"7.3/1.0="<<Div(7.3,1.0)<<endl; }
catch(double)
{
cout<<"except of deviding zero!\n"; }
cout<<"That is ok.\n"; }
double Div(double a,double b) { if(b==0.0) throw b; return a/b;} 运行结果为:
cout<<"7.3/0.0="<<Div(7.3,0.0)<<endl;
VC程序处理---异常处理浙大课程教程
7.3/2.0=3.65
except of deviding zero! That is ok.
10.3 异常处理机制
在处理程序和语句之间的相互作用使异常在大型应用程序中变得复杂。通常人们希望抛掷被及时捕获,以避免程序突然终止。此外,跟踪抛掷很重要,因为捕获确定该程序的后继进展。例如,抛掷和捕获可以用来重新开始程序内的一个过程,或者从应用程序
的一部分跳到另一部分,或者回到菜单。 例如,项目的代码说明了异常处理机制。
VC程序处理---异常处理浙大课程教程
通常这个处理程序应在所有异常处理块的最后,因为它与任何throw都匹配,目的是为避免定义的异常处理程序没能捕获抛掷的异常而使程序运行终止。
函数h()中的catch(Size)块,包含有一个抛掷异常语句throw 10,当实际执行这条语句时,将沿着调用链向上传递被函数f()中的catch(...)所捕获。如果没有f()中的catch(...),那么,异常将被系统的terminate()函数调用,后者按常规再调用abort()。
函数h1()中的抛掷throw Size,由于不在本函数的try块中,所以只能沿函 数调用链向上传递,结果被h()中的catch(Size)捕获。函数h1()中的抛掷throw Range,在try块中,所以首先匹配try块后的异常处理程序,可是没有被捕获,因而它又沿函数调用链向上,在函数f()中,catch(Range)块终于捕获了该抛掷。函数h1()中的catch(Size)块,包含一个抛掷throw,没有带参数类型,它表示将捕获到的异常对 …… 此处隐藏:3090字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [教育文库]夜场KTV服务员的岗位职责及工作流程[1]
- [教育文库]企划、网络、市场绩效考核方案
- [教育文库]学党史、知党情、强党性--“党的基本理
- [教育文库]2016年高考物理大一轮总复习(江苏专版
- [教育文库]干部廉洁自律自查自纠的报告
- [教育文库]2010年北京大学心理学系拟录取硕士研究
- [教育文库]资金时间价值练习题及答案
- [教育文库]保护环境的心得体会
- [教育文库]英语角内容:英语趣味小知识
- [教育文库]档案收集与管理工作通知
- [教育文库]劳动规章制度范本范本
- [教育文库]高考物理一轮复习课后限时作业1运动的
- [教育文库]机械工艺夹具毕业设计195推动架设计说
- [教育文库]通用技术教学比赛说课稿2
- [教育文库]2018年四年级英语下册 Module 7 Unit 2
- [教育文库]第2章 宽带IP网络的体系结构
- [教育文库]九年级化学第五单元课题3《根据化学方
- [教育文库]小学英语六年级情态动词用法归纳
- [教育文库]甲级单位编制窑井盖项目可行性报告(立
- [教育文库]2016-2021年中国城市规划行业全景调研
- 高考英语听力十大场景词汇总结
- 全省领导班子思想政治建设座谈会会议精
- 人教版新课标高一英语提优竞赛试题 下
- 江西省2014年生物中考试题
- 长沙镇食品药品安全事故应急预案
- 《金刚石、石墨和C60》片段教学设计
- 福州教育学院(王旭东)
- 基于EDA音乐播放器的设计
- 9、古诗两首《夜书所见》《九月九日忆
- 小学语文课外阅读有效策略探讨
- 贵州文化产业发展成支柱产业的问卷调查
- 膀胱类癌的诊治体会(附3例报告)
- 发动机积碳产生的原因
- Configuring Code Composer Studio for
- 学生良好的心理素质如何培养点滴谈
- 46 电沉积法制备锂离子电池用硅-锂薄膜
- 美舍雅阁公司管理中各部门职责
- 去壳剥皮的小妙招
- 六自由度运动平台的仿真研究
- Pride and Prejudice(傲慢与偏见)