1 / 33

第 9 章 程序调试与错误处理

第 9 章 程序调试与错误处理. 9.1 程序调试 9.2 错误处理程序设计 9.3 错误处理实例. 9.1 程序调试. 9.1.1 应用程序错误与调试 9.1.2 段点设置与立即窗口. 返回. 9.1.1 应用程序错误与调试. 1 . 应用程序的错误 为了更有效的使用调试手段,把可能遇到的错误分成 3 类,即编译错误、运行错误、逻辑错误 2 .调试工具栏

yamka
Download Presentation

第 9 章 程序调试与错误处理

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第9章 程序调试与错误处理 • 9.1 程序调试 • 9.2 错误处理程序设计 • 9.3 错误处理实例

  2. 9.1 程序调试 • 9.1.1应用程序错误与调试 • 9.1.2段点设置与立即窗口 返回

  3. 9.1.1应用程序错误与调试 1.应用程序的错误 为了更有效的使用调试手段,把可能遇到的错误分成3类,即编译错误、运行错误、逻辑错误 2.调试工具栏 Visual Basic 6.0不能诊断或更正错误,但能提供工具帮助用户分析程序是如何从过程的一部分流向另一部分,分析变量和属性是如何随着语句的执行而改变。有了调试工具,就能深入到应用程序内部去观察,从而确定到底发生了什么,以及会发生。 返回

  4. 9.1.2段点设置与立即窗口 • 1.Visual Basic的模式 • 2.中断与程序调试 • 3.监视与监视表达式 • 4.立即窗口 返回

  5. 1.Visual Basic的模式 Visual Basic的运行有三种模式:设计模式、运行模式(Run)和中段模式(Break)。 启动Visual Basic后进入设计模式,主窗口标题栏有“[设计]”二字。建立应用程序的所有步骤基本上都在设计模式下完成。 执行“启动”命令后进入执行模式,Visual Basic的主窗口标题栏上的“[设计]”变成了“[运行]”。在运行模式下,Visual Basic把全部控制权都交给应用程序,可以查看程序代码,但不能修改程序代码,还可以执行“结束”命令回到设计模式。 中断模式是程序执行过程的一个暂停状态,进入中断模式后主窗口标题栏上的“[运行]”变成了“[break]”.在中断模式下,可以检查、修改程序代码,也可以检查程序中变量的中间值,还可以继续执行

  6. 2.中断与程序调试 Visual Basic提供段点和Stop语句,把应用程序置于中断模式下。 可以使用以下方法进入中断模式: (1在程序中使用Stop语句,程序运行到Stop语句进入中断模式; (2)在设计或中断模式下设置程序的断点; (3)程序运行时出现错误,自动进入中断模式; (4)程序运行时,按下Ctrl+Break键进入中断模式; (5)程序运行时,在菜单栏上选择“运行→中断”选项进入中断模式; (6)程序运行时,单击工具栏上的“中断”按钮进入中断模式。

  7. 设置断点的方法:在程序代码窗口中,将光标移到希望中断的语句上,在菜单上选择“调试---切换段点”选项,光标所在语句设置为断点。被设为断点的语句为反向显示并在其前面显示一个原点。设置断点的方法:在程序代码窗口中,将光标移到希望中断的语句上,在菜单上选择“调试---切换段点”选项,光标所在语句设置为断点。被设为断点的语句为反向显示并在其前面显示一个原点。 • 利用断点只能粗略的判断错误发生的位置。利用程序跟踪可以直接看到程序的执行情况和执行顺序,找到发生错误的位置。对于逻辑错误,利用断点可以跟踪到程序运行的去向。Visual Basic的跟踪方式包括逐语句执行,逐过程执行和跳出执行。 • 逐语句执行是每次只执行一个语句,并根据输出结果判断执行的语句是否正确。逐语句执行开始后,程序进入执行模式,执行一条语句切换到中断模式,并把下一条语句作为待执行的语句。 • 逐过程执行与逐语句执行基本相同。逐过程执行不跟踪到过程中,即把被调用的过程当作一条语句一次执行完毕。“跳出”可以执行当前过程的饿其他部分,并在调用过程的下一行中断执行。 • 若想暂时避开程序的某一部分,可以通过跳出执行来实现。

  8. 3.监视与监视表达式 调试程序时,一个计算可能得不道想要的结果,当某个变量或属性取特定范围内的值时,可能会现问题。许多调试问题不是由单个语句产生的,因而需要在整个过程观察变量或表达式的情况。Visual Basic自动对监视表达式进行监视。应用程序进入中断模式后,这些监视表达式出现在“监视”窗口中,可在该处观察其值。 无论何时,只要表达式的值改变或等于一个特定的值,就可把应用程序设置为中断模式直接观察。例如,循环计数器达到一个特定值时,可用一个监视表达式把应用程序设置为中断模式,而不是一次一条语句执行数十次乃至数百次循环。当过程中的一个标志值改变时,都可使应用程序进入中断。 在设计或中断模式下,可添加监视表达式。方法:在菜单栏上选择“调试→添加监视”选项,弹出“添加监视”对话框,在该对话框中添加监视表达式

  9. 添加监视表达式的步骤如下: • 在菜单栏上选择“调试→添加监视”选项,弹出“添加监视”对话框。 • 代码编辑器中的当前表达式将出现在“表达式”框中。如果这不是需要监视表达式,可在“表达式”框中直接输入表达式。 • 若有必要,设置要监视的变量的范围。如果在“上下文”中选定“过程”或“添加模块”选项,则从相应的列表框中选定一个过程、窗体或模块名。 • 若有必要,在“监视类型”组中选定选项按钮,以确定对监视表达式的响应方式。 • 单击“确定”按钮,完成设置。

  10. 4.立即窗口 程序进入中断模式后,将自动激活立即窗口;也可以直接在系统菜单栏上选择“试图→立即窗口”选项,打开立即窗口。若中断时程序正在执行某个过程,该过程的代码窗口与立即窗口一起显示。在立即窗口中,可以直接执行Visual Basic语句,并且不影响代码窗口的程序代码。

  11. 9.2 错误处理程序设计 9.2.1应用程序错误与调试 9.2.2 Resume 语句 9.2.3 Err对象和Erl函数 9.2.4错误处理程序

  12. 9.2.1应用程序错误与调试 1.设置错误陷阱语句 2.取消该错误捕捉功能

  13. 1.设置错误陷阱语句 Visual Basic用On Error语句捕捉程序运行时的错误,以便设置错误陷阱,并利用Err对象及相关的属性、方法确定程序运行时的错误起因,以选择响应的解决措施,实现在线错误处理。 语句格式:On Error语句有3种基本格式。 格式1:On Error <行号> 格式2:On Error 0 格式3:On Error Resume Next 功能:设置或取消错误捕捉功能。 说明: 在程序中,用On Error语句语句设置的错误捕捉功能一直起作用,直到另一个On Error语句取消所设置的错误捕捉功能。在错误捕捉处理程序起作用期间,一旦发生错误,程序即转向指定的行标号并执行错误处理程序。 格式1设置从指定行号开始的错误处理程序。〈行号〉可以是任意的行标号或行号,并要求与On Error语句在同一过程内。 格式2取消已设置的错误捕捉程序。在已设置错误捕捉处理程序的情况下,执行该语句将已激活的错误处理程序变成无效。 格式3指明发生运行错误时程序跳过错误继续执行,即发生错误时,不对错误做任何处理,直接跳到产生错误语句的下一个语句继续执行。若希望在程序出错时进行错误处理,必须用格式1重新设置其他错误处理,或用格式

  14. 2 取消该错误捕捉功能 例如: Private Sub Form_Load() On Error Goto ErrLine … If n=100 On Error Resume Next End If … Exit Sub ErrLine … End Sub

  15. 9.2.2 Resume 语句 语句格式:该语句有3种格式。 格式1:Resume 格式2:Resume Next 格式3:Resume <行号> 功能:该语句放在错误处理程序中,指定执行错误处理程序后继续执行的语句,以便在指定位置恢复程序的执行。 说明:该语句与Return语句类似,但只能用于错误处理程序中,即必须与On Error语句配套使用。

  16. 9.2.3 Err对象和Erl函数 • Err对象含有关于运行出错时的错误信息,其属性由错误的生成者设置。该错误生成着可能是Visual Basic系统,也可能是某对象,或者是程序设计者。Err对象的默认属性是Numeber。该默认属性可以直接用对象名称Err表示,所以不必修改以前Err函数或Err语句书写的程序代码。 • 出现错误时,Err返回错误的代码,错误代码的取值范围为1~32676。 • Err函数返回错误语句的行号。若发生错误的程序没有行号,则Err函数总是返回0。虽然Visual Basic中也可以使用行号,但行号只是某一行的标识,但与旧版本Basic语言兼容,与程序的执行顺序无关。 • 只有在发生错误时,Err对象和Erl函数才返回有意义的值,通常把它们放在错误处理程序中,用来确定所发生的是什么错误,以及采取什么操作纠正错误。

  17. 以下程序可以查出错误代码对应的错误信息。 Private Sub Command_Click() Dim Msg,NI,UsrErr On Error GoTo ErrHand NI=Chr(10) Msg=“请输入一个错误号查看相应错误信息” UsrErr=InputBox(Msg) Error UsrErr Exit Sub ErrHand: Msg=“错误号”& Err &“的信息是:”& NI & """" & Error(Err) & """"  MsgBox Msg Resume Next End Sub

  18. 9.2.4错误处理程序 应用程序运行过程中,出现错误是不可避免的,硬件出现的问题或用户的误操作,都会造成运行出错,这些错误可能使程序意外的终止,一般无法使应用程序继续运行。有些错误也许不会中断程序运行,但可能使代码产生意想不到的结果。因此必须用On Error语句捕获错误并执行错误处理程序,以避免应用程序不必要的意外中断。在程序设计中,通过设置错误对象Err的各种属性,如错误号、描述等,使应用程序在错误发生时可以对错误状况作出响应或处理。

  19. 设计错误处理程序包括3个步骤: 1、设置错误捕获 当应用程序执行到On Error语句时,激活错误捕获,用 On Error语句指定错误处理程序开始的标号。当错误发生时,通知应用程序在分支点设置或激活错误捕获。当包含错误捕获的过程处于活动时,错误捕获始终是激活的,即直到该过程执行Exit sub、Exit函数、Exit属性、End Sub、End函数或End属性语句时,错误捕获才停止。尽管在任一时刻任一过程中只能激活一个错误捕获,但可建立几个选择的错误捕获并在不同的时刻激活不同的错误捕获程序。

  20. 2、编写错误处理程序 错误处理程序应对所有能预见的错误都不得作出响应或处理。错误处理程序逻辑的第一步,是添加行标号,行标号标志着错误处理程序的开始。行标号应该有一个具有描述性的名称,其后必须加冒号。 基本的约定:把错误处理代码放在过程末端,该过程在紧靠行标号前方处使用Exit Sub、Exit函数或Exit属性语句。这样,如果未出现错误,过程可避免行错误处理代码。 错误处理程序体包含实际处理错误的代码,通常以Select Case 或if...Then…Else语句的形式出现。程序中需要确定可能会发生什么错误,对每种错误提供响应的操作方法。例如,在“磁盘未准备好”错误的情况下,需要提示用户插盘。为了处理所有意想不到的错误,应使用else或case else语句提供选项,以对不能预测的错误作出响应。 Err对象的Number属性包含数值型的错误代码,错误代码表最新的运行错误号。借助Err对象与select case或if …then…else语句的组合,可以对出现的任何错误采取有针对性的处理和操作。

  21. 3、出错误处理程序 在错误处理程序中,可以用 Resume Next语句使程序返回出错语句之后的语句。

  22. 9.3 错误处理实例 首先建立程序,这个程序的目的是要求一个整数的阶乘。当输入一个正整数时,程序首先对输入参数进行有效性检查,如果参数有效则求出阶乘并返回结果,否则提示输入参数无效,并要求重新输入。 按下面步骤建立这个程序: 运行Visual Basic6.0并建立标准工程。 单击工具栏中的Lable控件,在Form1窗体上绘制一个标签,并将其Caption属性社为“请输入(0—20)之间整数”。 单击工具栏中的Text控件,并在Form1窗体中绘制一个文本框,然后将其Text设置为空。 单击工具栏中的CommandButton控件,并放置在窗体中,将其Caption属性设为“计算阶乘”。 最后再放置两个标签到窗体Form1中,属性采用缺省值。 在这个程序中需要处理的事件过程只有Command1_Click。在该过程中,需要进行参数检查和进行阶乘计算。这里编写了两个函数来完成这两个功能。 函数CheckParameters用来检查用户输入的参数。返回值是检查过的合法参数。 函数JIECHENG计算一个数的阶乘值。它返回计算结果

  23. 函数Checkparaneters的代码如下: Function checkprameters() ‘将用户输入转化为数值参数 x=Val(text1.text) ‘检查用户输入是否有效 ‘如果输入错误,则提示用户重新输入 ‘输入正确,就把检查过的参数作为结果返回 if x>20 and x<0 then label2.caption=”输入错误!请重新输入!” ‘清除标签上以前显示的结果 ‘并返回一个非正数值 label3.caption=” “ checkparameters=-1 else checkparameters=x label2.caption=”结果是:” end if end function

  24. 函数JIECHENG的代码如下: function jiecheng(byval x as integer)as long if x=o or x=1 then jiecheng=1 else jieheng=x*jiecheng(x-1) end if end function 在COMMAND1-CLICK过程中,利用这两个自定义函数完成预计的功能。COMMAND1-CLICK过程的代码如下: private sub command1_click() retV=checkparameters( ) if retV>=0 then label3.caption=str$(jiecheng(retV)) end if end sub 到此,完成了这个程序的编写。

  25. 下面测试程序的运行。 (1)按F5键运行程序,并在文本框中输入0,单击[计算阶乘]按扭,得到图所示的结果。这个结果是正确的。

  26. (2)测试计算-1的阶乘,正常情况下程序应显示输入错误等提示。在文本框中输入“-1”,单击[计算阶乘]按钮,这时看到图所示结果。(2)测试计算-1的阶乘,正常情况下程序应显示输入错误等提示。在文本框中输入“-1”,单击[计算阶乘]按钮,这时看到图所示结果。 显然这个结果与预期的不符,是错误的。下面就来查找该错误。由于输入无效参数-1时程序并没有显示出错提示所以推测在检查参数的代码中出了问题。

  27. (3)打开代码窗口,在调用CHeckPARAMETERS处设置断点,以便程序在检查参数之前中断运行,这样可以查看程序状态和中间结果。加入断点的操作可按下面步骤进行。(3)打开代码窗口,在调用CHeckPARAMETERS处设置断点,以便程序在检查参数之前中断运行,这样可以查看程序状态和中间结果。加入断点的操作可按下面步骤进行。 • 代码窗口中,把光标移动到要加断点的一行。 • 打开[调试]菜单,单击[切换断点]菜单项或按F9键。这时所选的语句出现一红色亮条,标识所设断点处。图显示了加入断点后的情形。 • 如果要去除断点,可以打开[调试]菜单,单击[切换断点]菜单项或按F9键。也可打开[调试]菜单,单击[清除所有断点]菜单项以清除所有断点。

  28. (4)按F5键运行程序。在文本框中输入“-1”,单击[计算阶乘]按钮,这时程序在断点处中断,。下面单步执行,跟踪检查参数这部分代码的运行。(4)按F5键运行程序。在文本框中输入“-1”,单击[计算阶乘]按钮,这时程序在断点处中断,。下面单步执行,跟踪检查参数这部分代码的运行。 (5)打开[调试]菜单,单击[语句]菜单项或按F8键单步执行。这时,程序转入CHECKPARAMETER函数中。在执行到IF 语句处时,打开[视图]菜单击[立即窗口]菜单项,这时桌面上出现了[立即]窗口。在[立即]窗口中输入“?X”,观程序接收到的参数值。 [立即]窗口中显示的X值为-1,说明程序接收到的参数是正确的,错误可能在后面,所以继续单步执行。 (6)按F8键使用单步运行,程序流程转到ELSE语句处。现在发现问题就出在这里,因输入的-1不在0---20之间,程序应执行LABEL2。CAPTION=“输入错误!请重新输入!”语句,以显示输入错误提示,而现在没有执行这条语句,因此在IF判断语句中的条件设置可能有问题。仔细查看IF 语句,发现果然有问题,这条语句写的是: if x>20 and x<0 then “if x>20 and x<0”是一对矛盾的条件,所以无论输入什么数字,程序都不会执行显示出错信息的语句。应当把条件改成“if x>20 OR x<0”,再按F5键运行。现在程序已经显示出错信息,说明参数检查部分已正常工作。

  29. (7)关闭正在运行的程序,打开[调试]菜单,单击[清除所有断点]菜单项,然后按F5键运行程序。在输入文本框中输入5,再单击[计算阶乘]按钮。(7)关闭正在运行的程序,打开[调试]菜单,单击[清除所有断点]菜单项,然后按F5键运行程序。在输入文本框中输入5,再单击[计算阶乘]按钮。 (8)观察计算结果,发现5的阶乘等于1,显然是不正确的。这说明阶乘计算也有错误。下面再观察求解阶乘的函数 。 (9)关闭正在运行的程序,然后打开[调试]菜单,单击[添加监视]菜单项,并按图所示进行设置。单击[确定]按钮,再按F5键运行程序。在输入框重新输入5,单击[计算阶乘]按钮。

  30. (10)程序在调用JIECHENG函数处中断。 打开[视图]菜单,单击[调用堆栈]菜单项,打开[调用堆栈]窗口,如图所示,观察JIECHENG函数的递归调用是否存在问题。 在[调用堆栈]窗口中显示了当前还末执行的函数和过程。这里显示了5个“工程1.FORM1.JIECHENG”工程,说明JIECHENG函数在计算5的阶乘时的递归调用是正确的。再看[监视]窗口,JIECHENG函数当前的返回值为1,也是正确的。

  31. (11)在[调用堆栈]窗口中单击[关闭]按钮,关闭[调用堆栈]窗口,然后按F5键继续运行。这时JIECHENG函数返回值改变,程序进入中断方式。再打开[调用堆栈]窗口。(11)在[调用堆栈]窗口中单击[关闭]按钮,关闭[调用堆栈]窗口,然后按F5键继续运行。这时JIECHENG函数返回值改变,程序进入中断方式。再打开[调用堆栈]窗口。 JIECHENG函数的返回值为0,而实际应为2,错误发生在这里。关闭[调用堆栈]窗口,结果程序运行。仔细查看JIECHENG部分的函数代码: Function jiecheng(byval x as integer)as long If x=o or x=1 then Jiecheng=1 Else Jieheng=x*jiecheng(x-1) End if End function 原来在进行递归运算时,将JIECHENG误写为JIEHENG,现将其改为JIECHENG,再运行程序。仍输入参数5,然后单击[计算阶乘]按扭,会得到正确结果,

  32. 9.4 本章小结 应用程序在运行中出现错误是不可避免的,甚至防不胜防。虽然程序设计人员可以消除大部分潜在的错误,语法错误也可以在编译中查出,但不可能消除所有的错误。因此,必须在系统运行阶段发现或捕捉这些不可预见的错误。Vb中用On Error语句捕捉程序运行时的错误,以便设置错误陷阱,通过编写错误处理程序,对所有能预见的错误都作出响应或处理,实现在线错误处理。 VB不能诊断或更正错误,但能提供工具帮助用户分析和测试。有了调试工具,就能深入到应用程序内部去观察,从而确定到底发生了什么以及为什么会发生。VB的调试支持断点、中断表达式、通过代码一次执行一个语句或一个过程、显示变量和属性的值等方式。

  33. 习题 • 一、判断题 • 1、错误处理程序只能判断程序中的语法错误。 • 2、Visual Basic的“断点”由“切换断点”命令设置,撤消“断点”可由“切换断点”命令完成。 • 3、Visual Basic中On Err GoTo 0 语句是用于捕捉错误的语句。 • 4、若在On Error GoTo 0语句之后发生了运行错误,则程序由一般的Visual Basic错误处理子程序处理该错误,且程序可以继续运行。 • 二、问答题 • 1、应用程序错误包括哪几种类型?它们一般在什么情况下产生? • 2、在Visual Basic中可以使用哪些方法对程序进行调试,它们各有什么优缺点? • 3、试比较监视窗口与立即窗口的区别? • 4、在Visual Basic中创建一个应用程序的基本步骤是什么? • 5、编写错误处理程序有什么要求?列出常用的几个语句或方法? • 6、什么是监视表达式?监视表达式有什么作用? • 三、设计题 • 试设计一个错误处理程序,处理从软盘A读取文件时产生的错误,若A驱动器未准备好,则显示“Disk Not Ready!”等;当软磁盘中不存在所打开的文件时,显示“File Not Found!”等信息。

More Related