教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 文库大全 > 教育文库 >

VC程序处理---异常处理

来源:网络收集 时间:2025-09-19
导读: 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字,全部文档内容请下载后查看。喜欢就下载吧 ……

VC程序处理---异常处理.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wenku/1813551.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)