版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第8章程序调试与错误处理应用程序在运行中出现错误是不可避免的,甚至防不胜防。虽然程序设计人员可以消除大部分潜在的错误,语法错误也可以在编译中查出,但不可能消除所有的错误。因此,必须在系统运行阶段发现或捕捉这些不可预见的错误。本章介绍VB提供的程序调试工具和错误处理程序的设计。8.1程序调试
应用程序在运行过程中出现错误是不可避免的,虽然细心的程序设计人员经过周密的测试可以消除许多潜在的错误,语法错误也很容易在编译中查出。实际上,人们不可能消除所有的错误。因此,必须在系统运行阶段发现或捕捉这些不可预见的错误。在应用程序中查找并修改错误的过程称为调试。为了分析应用程序的运行情况,VisualBasic6.0提供了几种调试工具。这些工具不但对查出错误根源特别有用,而且还能用来改变应用程序,或了解其它应用程序的工作方式。8.1.1应用程序错误与调试
1.应用程序的错误为了更有效地使用调试手段,把可能遇到的错误分成三类,即编译错误、运行错误、逻辑错误。(1)编译错误。编译错误是由于不正确构造代码而产生的。如果不正确地键入了关键字、遗漏了某些必需的标点符号,或在设计时使用了一个Next语句而没有For语句与之对应等,VisualBasic在编译应用程序时将检测到这些错误。编译错误还包括语法错误。
VisualBasic6.0可以检查大部分的语法错误。为了检查语法错误,可以为VisualBasic6.0设置自动语法检测功能。方法:在菜单栏上选择“工具→选项”选项,弹出“选项”对话框,在“编辑器”选项卡中选定“自动语法检测”。图8-1是一个VisualBasic6.0自动检测编译错误的提示框。图8-1一个编译错误信息提示框(2)运行错误。应用程序在运行期间执行了一个不能执行的操作时,将会发生运行错误。假定有语句:Speed=Miles/Hours
如果变量Hours的值为零,除法是无效操作,尽管语句本身的语法是正确的。必须在运行应用程序才能检测到这个错误。(3)逻辑错误。当应用程序未按预期方式执行时,产生逻辑错误。从语法角度来看,发生逻辑错误时,应用程序的代码是有效的,在运行时也未执行无效操作,只是产生了不正确的结果。应用程序运行的正确与否,只有通过测试应用程序和分析产生的结果才能检验出来。2.调试工具栏
VisualBasic6.0不能诊断或更正错误,但能提供工具帮助用户分析程序是如何从过程的一部分流向另一部分的,分析变量和属性是如何随着语句的执行而改变。有了调试工具,就能深入到应用程序内部去观察,从而确定到底发生了什么,以及为什么会发生。
VisualBasic6.0的调试支持断点、中断表达式、监视表达式、通过代码一次执行一个语句或一个过程、显示变量和属性的值等方式;还包括专门的调试功能,比如可在运行过程中进行编辑、设置下一个执行语句以及在应用程序处于中断模式时进行过程测试等。在VisualBasic的“调试”工具栏上提供了几个工具按钮,如图8-2所示。启动结束中断切换断点逐过程本地窗口监视窗口逐语句跳出立即窗口快速监视调用堆栈表8-1简要叙述“调试”工具栏中每个工具按钮的作用,从表中可以了解到每个工具按钮在什么情况下才能更有效地帮助调试或分析应用程序。表8-1
“Debug”工具及其作用调试工具作用断点在“代码”窗口中确定一行,在该行暂停应用程序的执行逐语句执行应用程序代码的下一个可执行行,并跟踪到过程中逐过程执行应用程序代码的下一个可执行行,但不跟踪到过程中跳出执行当前过程的其它部分,并在调用过程的下一行处中断执行“本地”窗口显示局部变量的当前值“立即”窗口当应用程序处于中断模式时,允许执行代码或查询值“监视”窗口显示选定表达式的值快速监视当应用程序处于中断模式时,列出表达式的当前值调用堆栈处于中断模式时,打开对话框来显示所有已被调用但尚未完成运行的过程8.1.2断点设置与立即窗口
1.VisualBasic的模式
VisualBasic的运行有三种模式:设计模式、运行模式(Run)、中断模式(Break)。启动VisualBasic后进入设计模式,在设计模式下主窗口标题栏有“[设计]”二字。建立应用程序的所有步骤基本上都在设计模式下完成。执行“启动”命令后进入执行模式,VisualBasic的主窗口标题栏上的“[设计]”变成了“[运行]”。在运行模式下,VisualBasic把全部控制权都交给应用程序,可以调试应用程序,可以查看程序代码,但不能修改程序代码,可以执行“结束”命令回到设计模式。中断模式是程序执行过程的一个暂停状态,进入中断模式后主窗口标题栏上的“[运行]”变成了“[break]”。在中断模式下,可以检查、修改程序代码,也可以检查程序中的变量的中间值,还可以继续执行。2.中断与程序跟踪在调试时,可以在认为有问题的代码处暂停程序执行,以便使用调试工具找出错误。另外,为了查看程序的执行情况,还需要对程序进行跟踪,以便随时发现错误。VisualBasic提供断点和Stop语句,把应用程序置于中断模式之下。可以用以下方法进入中断模式:(1)在程序中使用STOP语句,程序运行到STOP语句时进入中断模式;(2)在设计模式或中断模式下设置程序的断点;(3)程序运行时出现错误,自动进入中断模式;(4)程序运行时,按下CTRL+BREAK键进入中断模式;(5)程序运行时,在菜单栏上选择“运行→中断”选项进入中断模式;(6)程序运行时,单击工具栏上的“中断”工具按钮进入中断模式。设置断点的方法:在程序代码窗口中,将光标移至希望中断的语句上,在菜单栏上选择“调试→切换断点”选项,光标所在语句设为断点。被设为断点的语句为反相显示并在其前面显示一个园点。
利用断点只能粗略地判断错误发生的位置。利用程序跟踪可以直接看到程序的执行情况和执行顺序,以找到发生错误的位置。特别是对于逻辑错误,可以跟踪到程序运行的去向。VisualBasic的跟踪方式包括逐语句执行、逐过程执行和跳出执行。逐语句执行是每次只执行一个语句,并根据输出结果判断执行的语句是否正确。逐语句执行开始后,程序进入执行模式,执行一条语句后切换到中断模式,并把下一条语句作为待执行的语句。逐过程执行与逐语句执行基本相同。逐过程执行不跟踪到过程中,即把被调用的过程当作一条语句一次执行完毕。“跳出”可以执行当前过程的其它部分,并在调用过程的下一行中断执行。若想暂时避开程序的某一部分,可以通过跳出执行来实现。3.监视与监视表达式调试程序时,一个计算可能得不到想要的结果,当某个变量或属性取特定范围内的值时,可能会出现问题。许多调试问题不是由单个语句产生的,因而需要在整个过程观察变量或表达式的情况。VisualBasic自动对监视表达式进行监视。应用程序进入中断模式后,这些监视表达式出现在“监视”窗口中,可在该处观察其值。无论何时,只要表达式的值改变或等于一个特定的值,就可把应用程序设置为中断模式来直接观察。例如,循环计数器达到一个特定值时,可用一个监视表达式把应用程序设置为中断模式,而不是一次一条语句执行数十次乃至数百次循环。当过程中的一个标志值改变时,都可使应用程序进入中断模式。在设计或中断模式下,可添加监视表达式。方法:在菜单栏上选择“调试→添加监视”选项,弹出“添加监视”对话框(见图8-3),在该对话框中添加监视表达式。在“添加监视”对话框中,“表达式”框用于输入监视表达式。表达式是一个变量、属性、函数调用或其它任何有效的表达式。“上下文”选项组用于设置表达式中要监视变量所处的范围(位置),当有名字相同而范围不同的变量时,必须使用该选项组。可把监视表达式中的变量的范围限制为由特定过程、特定窗体或模块组成,也可通过选定“所有过程及所有模块”,使范围可用于整个应用程序。“监视类型”选项组用来设置VisualBasic对监视表达式响应的方式。应用程序进入中断模式后,系统可对表达式进行监视并显示其值,在表达式的值为真(非零),或表达式的值发生改变时,可使应用程序自动进入中断模式。添加监视表达式的步骤如下:(1)在菜单栏上选择“调试→添加监视”选项,弹出“添加监视”对话框。(2)代码编辑器中的当前表达式将出现“表达式”框中。如果这不是需要监视的表达式,可在“表达式”框中直接输入表达式。(3)若有必要,设置要监视的变量范围。如果在“上下文”中选定“过程”或“添加模块”选项,则从相应的列表框中选定一个过程、窗体或模块名。(4)若有必要,在“监视类型”组中选定选项按钮,以确定对监视表达式的响应方式。(5)单击“确定”按钮,完成设置。也可直接把表达式从代码编辑器中拖放到监视窗口来添加表达式。添加的监视表达式都在监视窗口中列出,并显示监视表达式的值、类型等信息,如图8-4所示。4.立即窗口程序进入中断模式后,将自动激活立即窗口;也可以直接在系统菜单栏上选择“视图→立即窗口”选项,打开立即窗口,如图8-5所示。若中断时程序正在执行某个过程,该过程的代码窗口与立即窗口一起显示。在立即窗口中,可以直接执行VisualBasic语句,并且不影响代码窗口中的程序代码。图8-4监视窗口图8-5调试中使用的立即窗口
立即窗口在程序调试中十分有用,可以用Print方法在立即窗口中输出(或显示)程序执行的中间结果;或在程序执行过程中显示、修改变量或某些属性的值,达到改变程序运行进程的目的;还可以用于测试通用过程,即在一个通用过程设计完成后,进入立即窗口,键入适当的语句调用通用过程,并根据过程的运行结果判断通用过程的执行是否正确。8.2.1设置错误陷阱语句
VisualBasic用OnError语句捕捉程序运行时的错误,以便设置错误陷阱,并利用ERR对象及相关的属性、方法确定程序运行时的错误起因,以选择相应的解决措施,实现在线错误处理。语句格式:OnError语句有三种基本格式。格式1:OnErrorGoto<行号>
格式2:OnErrorGoto0
格式3:OnErrorResumeNext
功能:设置或取消错误捕捉功能。说明:(1)在程序中,用OnError语句设置的错误捕捉功能一直起作用,直到另一个OnError语句取消所设置的错误捕捉功能。在错误捕捉处理程序起作用期间,一旦发生错误,程序即转向指定的行标号并执行错误处理程序。(2)格式1设置从指定行号开始的错误处理程序。<行号>可以是任意的行标号或行号,并且要求与OnError语句在同一过程内。(3)格式2取消已设置(或激活)的错误捕捉程序。在已设置错误捕捉处理程序的情况下,执行该语句将已激活的错误处理程序变成无效。(4)格式3指明发生运行错误时程序跳过错误继续执行,即发生错误时,不对错误作任何处理,直接跳到产生错误语句的下一个语句继续执行。若希望在程序出错时进行错误处理,必须用格式1重新设置其它错误处理,或用格式2取消该错误捕捉功能。例如:PrivateSubForm_Load()OnErrorGotoErrLine
…Ifn=100OnErrorResumeNextEndIf
…ExitSubErrLine:
…EndSub8.2.2
Resume语句
语句格式:该语句有三种格式。格式1:Resume
格式2:ResumeNext
格式3:Resume<行号>
功能:该语句放在错误处理程序中,指定执行错误处理程序后继续执行的语句,以便在指定位置恢复程序的执行。说明:该语句与Return语句类似,但只能用于错误处理程序中,即必须与OnError语句配套使用。8.2.3
Err对象和Erl函数
Err对象含有关于运行出错时的错误信息,其属性由错误的生成者设置。该错误生成者可能是VisualBasic系统,也可能是某个对象,或者是程序设计者。Err对象的默认属性是Number。该默认属性可以直接用对象名称Err表示,所以不必修改以前用Err函数或Err语句书写的程序代码。出现错误时,Err返回错误的代码,错误代码的取值范围为1~32767。常见错误代码及对应错误信息见附录E。
Erl函数返回错误语句的行号。若发生错误的程序没有行号,则Erl函数总是返回0。虽然VisaulBasic中也可以使用行号,但行号只是某一行的标识,且与旧版本Basic语言兼容,与程序的执行顺序无关。只有在发生错误时,Err对象和Erl函数才返回有意义的值,通常把它们放在错误处理程序中,用来确定所发生的是什么错误,以及采取什么操作纠正错误。[例8-1]以下程序可以查出错误代码对应的错误信息。
PrivateSubCommand1_Click()DimMsg,Nl,UsrErrOnErrorGoToErrHandNl=Chr(10)Msg="请输入一个错误号查看相应错误信息."UsrErr=InputBox(Msg)ErrorUsrErrExitSubErrHand:Msg="错误号"&Err&"的错误信息是:"&Nl&Nl&""""&Error(Err)&""""MsgBoxMsgResumeNextEndSub[例8-2]错误处理程序实例。[程序代码]
PublicSubOnErrorDemo()
OnErrorGotoErrorHandler ‘设置错误陷阱
Open“testfile”ForOutputas#1
Kill“testfile”
OnErrorGoto0 ‘关闭错误陷阱
OnErrorResumeNext ‘跳过错误继续执行
ObjectRef=GetObject(“MyWord.Basic”)
IfErr.Number=440Then ‘OLE自动化错误
Msg=“TherewasanerrorattemptingtoopentheOLEobject!”
MsgBoxMsg,,“DeferredErrorTest”
Err.Clear ‘清除Err对象字段
EndIf
ExitSub
ErrorHandler: ‘错误处理程序
SelectCaseErr.Number ‘计算错误号
Case55 ‘”Fileareadyopen”
错误
Close#1CaseElse
…EndSelectResume ‘返回引发错误的那行语句继续执行
EndSub8.2.4错误处理程序
应用程序运行过程中,出现错误是不可避免的。硬件出现的问题或用户出乎意料的操作,都会造成运行出错,这些错误可能使程序意外地终止,一般无法使应用程序继续运行。有些错误也许不会中断程序运行,但可能使代码产生意想不到的结果。因此,必须用OnError语句捕获错误并执行错误处理程序,以避免应用程序不必要的意外中断。在程序设计中,通过设置错误对象Err的各种属性,如错误号、描述等,使应用程序在错误发生时可以对错误状况作出响应或处理。例如,可用以下代码处理无效驱动器等类型的问题:FunctionFileExists(filename)AsBooleanDimMsgAsStringOnErrorGoToCheckError‘检测到错误,则响应错误处理程序
FileExists=(Dir(filename)<>“”)ExitFunction‘如果未出现错误,则避免使用错误处理程序CheckError:‘如果出现错误,则在此分支。
ConstmnErrDiskNotReady=71,mnErrDeviceUnavailable=68
‘定义常数以表示固定的VisualBasic错误代码
If(Err.Number=MnErrDiskNotReady)Then
‘vbExclamation、vbOK、vbCritical和vbOKCancel等是定义在VB类型库中的常数
Msg=“Putafloppydiskinthedrive“
Msg=Msg&“andclosethedoor.”IfMsgBox(Msg,vbExclamation&vbOKCancel)=vbOKThen
‘显示具有感叹号图标以及“确定”和“取消”按钮的消息框
ResumeElseResumeNextEndIf
ElseIfErr.Number=MnErrDeviceUnavailableThenMsg=“Thisdriveorpathdoesnotexist:“Msg=Msg&filenameMsgBoxMsg,vbExclamationResumeNextElseMsg=“Unexpectederror#”&Str(Err.Number)Msg=Msg&“occurred:“&Err.DescriptionMsgBoxMsg,vbCriticalStop‘用“Stop”信号灯图标和“确定”按钮显示消息框。
EndIfResumeEndFunction程序中,Err对象的Number属性包含错误号,它与运行时产生的错误相关联。Err对象的Description属性包含错误信息的简短描述。当系统产生“磁盘未准备”的错误时,代码显示一段信息,通知用户选择两个按钮之:“确定”或“取消”。如果选择“确定”,则Resume语句将操作返回到出错的语句处,并重新执行该语句。若错误已得到改正,则操作获得成功;否则程序又返回到错误处理程序。如果选择“取消”,则ResumeNext语句将控制程序返回出错语句之后的语句继续执行。若出现意想不到的错误,将显示一段简短的描述,说明错误的性质并在Stop语句处终止代码。错误处理程序是应用程序中捕获和响应错误的程序。对于预感可能会出错的任何过程(除非确知不会发生错误,否则应假定任何语句都可能导致错误),均要对这些过程添加错误处理程序。设计错误处理程序包括三个步骤:1.设置错误捕获当应用程序执行到OnError语句时,激活错误捕获,用OnError语句指定错误处理程序开始的标号。当错误发生时,通知应用程序在分支点设置或激活错误捕获。当包含错误捕获的过程处于活动时,错误捕获始终是激活的,即直到该过程执行ExitSub、Exit函数、Exit属性、EndSub、End函数或End属性语句时,错误捕获才停止。尽管在任一时刻任一过程中只能激活一个错误捕获,但可建立几个供选择的错误捕获并在不同的时刻激活不同的错误捕获程序。2.编写错误处理程序错误处理程序应对所有能预见的错误都作出响应或处理。错误处理程序的第一步,是添加行标号,行标号标志着错误处理程序的开始。行标号应该有一个具有描述性的名称,其后必须加冒号。基本的约定:把错误处理代码放在过程末端,该过程在紧靠行标号前方处使用ExitSub、Exit函数或Exit属性语句。这样,如果未出现错误,过程可避免执行错误处理代码。
错误处理程序体包含实际处理错误的代码,通常以SelectCase或If...Then...
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 劳动合同工资结构变更协议
- 劳动合同a条款
- 房贷贷款合同委托书
- 采购季度工作规划
- 2025年潍坊年货运从业资格证考试答案
- 2025年安康下载货运从业资格证模拟考试
- 2024年期货物偿债交易具体合同版B版
- 2025年开封货运从业资格模拟考试
- 2025年长春货运从业资格证模拟考试0题答案解析
- 2025年和田考货运资格证模拟试题
- 吃动平衡健康体重 课件 2024-2025学年人教版(2024)初中体育与健康七年级全一册
- 高效能人士的七个习惯(课件)
- 纪念一二九运动国旗下讲话稿5篇
- 2024-2025学年五年级科学上册第三单元《计量时间》测试卷(教科版)
- 审计模拟实训教程第四版马春静版部分答案
- 农村民兵连指导员述职报告范本
- 物流无人机垂直起降场选址与建设规范
- MOOC 数据挖掘与python实践-中央财经大学 中国大学慕课答案
- 浅析科学研究方法论在管理研究中的运用
- 芝麻油芝麻酱质量管理手册
- CRH380A动车组轮对检修流程及改进方案
评论
0/150
提交评论