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

33
第9第 第第第第第第第第第 9.1 程程程程 9.2 程程程程程程程程 9.3 程程程程程程

Upload: yamka

Post on 16-Mar-2016

93 views

Category:

Documents


2 download

DESCRIPTION

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

TRANSCRIPT

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

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

9.1 程序调试 9.2 错误处理程序设计 9.3 错误处理实例

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

9.1 程序调试

9.1.1应用程序错误与调试 9.1.2 段点设置与立即窗口

返回

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

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

返回

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

9.1.2 段点设置与立即窗口

1 . Visual Basic 的模式 2 .中断与程序调试 3 .监视与监视表达式 4 .立即窗口

返回

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

1 . Visual Basic 的模式 Visual Basic 的运行有三种模式:设计模式、运行模式( Run )和中段模式 (Br

eak) 。 启动 Visual Basic 后进入设计模式,主窗口标题栏有“ [ 设计 ]” 二字。建立

应用程序的所有步骤基本上都在设计模式下完成。 执行“启动”命令后进入执行模式, Visual Basic 的主窗口标题栏上的“ [ 设

计 ]” 变成了“ [ 运行 ]” 。在运行模式下, Visual Basic 把全部控制权都交给应用程序,可以查看程序代码,但不能修改程序代码,还可以执行“结束”命令回到设计模式。

中断模式是程序执行过程的一个暂停状态,进入中断模式后主窗口标题栏上的“ [ 运行 ]” 变成了“ [break]”. 在中断模式下,可以检查、修改程序代码,也可以检查程序中变量的中间值,还可以继续执行

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

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

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

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

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

3 .监视与监视表达式 调试程序时,一个计算可能得不道想要的结果,当某个变量或属性取特定

范围内的值时,可能会现问题。许多调试问题不是由单个语句产生的,因而需要在整个过程观察变量或表达式的情况。 Visual Basic 自动对监视表达式进行监视。应用程序进入中断模式后,这些监视表达式出现在“监视”窗口中,可在该处观察其值。

无论何时,只要表达式的值改变或等于一个特定的值,就可把应用程序设置为中断模式直接观察。例如,循环计数器达到一个特定值时,可用一个监视表达式把应用程序设置为中断模式,而不是一次一条语句执行数十次乃至数百次循环。当过程中的一个标志值改变时,都可使应用程序进入中断。

在设计或中断模式下,可添加监视表达式。方法:在菜单栏上选择“调试→添加监视”选项,弹出“添加监视”对话框,在该对话框中添加监视表达式

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

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

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

4 .立即窗口 程序进入中断模式后,将自动激活立即窗口;也可

以直接在系统菜单栏上选择“试图→立即窗口”选项,打开立即窗口。若中断时程序正在执行某个过程,该过程的代码窗口与立即窗口一起显示。在立即窗口中,可以直接执行 Visual Basic 语句,并且不影响代码窗口的程序代码。

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

9.2 错误处理程序设计

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

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

9.2.1 应用程序错误与调试

1 .设置错误陷阱语句

2 .取消该错误捕捉功能

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

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重新设置其他错误处理,或用格式

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

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

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

9.2.2 Resume 语句语句格式:该语句有 3种格式。 格式 1 : Resume

格式 2 : Resume Next

格式 3 : Resume < 行号 >

功能:该语句放在错误处理程序中,指定执行错误处理程序后继续执行的语句,以便在指定位置恢复程序的执行。

说明:该语句与 Return 语句类似,但只能用于错误处理程序中,即必须与 On Error 语句配套使用。

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

9.2.3 Err 对象和 Erl函数 Err对象含有关于运行出错时的错误信息,其属性由错误的生成者设置。该错

误生成着可能是 Visual Basic 系统,也可能是某对象,或者是程序设计者。Err对象的默认属性是 Numeber。该默认属性可以直接用对象名称Err表示,所以不必修改以前 Err 函数或 Err语句书写的程序代码。

出现错误时, Err返回错误的代码,错误代码的取值范围为 1 ~ 32676。 Err 函数返回错误语句的行号。若发生错误的程序没有行号,则 Err 函数总是

返回 0。虽然 Visual Basic 中也可以使用行号,但行号只是某一行的标识,但与旧版本 Basic 语言兼容,与程序的执行顺序无关。

只有在发生错误时, Err对象和 Erl函数才返回有意义的值,通常把它们放在错误处理程序中,用来确定所发生的是什么错误,以及采取什么操作纠正错误。

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

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

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

9.2.4 错误处理程序 应用程序运行过程中,出现错误是不可避免的,硬件出现的问题

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

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

设计错误处理程序包括 3个步骤:1、设置错误捕获 当应用程序执行到 On Error语句时,激活错误捕获,用 On Error

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

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

2、编写错误处理程序 错误处理程序应对所有能预见的错误都不得作出响应或处理。错误处理程序逻辑的第

一步,是添加行标号,行标号标志着错误处理程序的开始。行标号应该有一个具有描述性的名称,其后必须加冒号。

基本的约定:把错误处理代码放在过程末端,该过程在紧靠行标号前方处使用 Exit Sub、 Exit 函数或 Exit属性语句。这样,如果未出现错误,过程可避免行错误处理代码。

错误处理程序体包含实际处理错误的代码,通常以 Select Case 或 if...Then…Else语句的形式出现。程序中需要确定可能会发生什么错误,对每种错误提供响应的操作方法。例如,在“磁盘未准备好”错误的情况下,需要提示用户插盘。为了处理所有意想不到的错误,应使用 else或 case else语句提供选项,以对不能预测的错误作出响应。

  Err对象的Number属性包含数值型的错误代码,错误代码表最新的运行错误号。借助Err对象与 select case或 if …then…else语句的组合,可以对出现的任何错误采取有针对性的处理和操作。

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

3 、出错误处理程序 在错误处理程序中,可以用 Re

sume Next 语句使程序返回出错语句之后的语句。

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

9.3 错误处理实例首先建立程序,这个程序的目的是要求一个整数的阶乘。当输入一个正整数时,程

序首先对输入参数进行有效性检查,如果参数有效则求出阶乘并返回结果,否则提示输入参数无效,并要求重新输入。

按下面步骤建立这个程序:运行 Visual Basic6.0并建立标准工程。单击工具栏中的 Lable 控件,在 Form1窗体上绘制一个标签,并将其 Caption属

性社为“请输入( 0—20)之间整数”。单击工具栏中的 Text 控件,并在 Form1窗体中绘制一个文本框,然后将其 Text

设置为空。单击工具栏中的 CommandButton 控件,并放置在窗体中,将其 Caption属性设

为“计算阶乘”。最后再放置两个标签到窗体 Form1中,属性采用缺省值。在这个程序中需要处理的事件过程只有 Command1_Click。在该过程中,需要进

行参数检查和进行阶乘计算。这里编写了两个函数来完成这两个功能。函数 CheckParameters 用来检查用户输入的参数。返回值是检查过的合法参数。函数 JIECHENG计算一个数的阶乘值。它返回计算结果

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

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

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

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

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

下面测试程序的运行。( 1)按 F5键运行程序,并在文本框中输入 0,单击 [计算阶乘 ]按扭,

得到图所示的结果。这个结果是正确的。

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

( 2 )测试计算 -1的阶乘,正常情况下程序应显示输入错误等提示。在文本框中输入“ -1” ,单击 [计算阶乘 ]按钮,这时看到图所示结果。

显然这个结果与预期的不符,是错误的。下面就来查找该错误。由于输入

无效参数 -1时程序并没有显示出错提示所以推测在检查参数的代码中出了问题。

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

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

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

( 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键运行。现在程序已经显示出错信息,说明参数检查部分已正常工作。

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

( 7)关闭正在运行的程序,打开 [调试 ]菜单,单击 [ 清除所有断点 ]菜单项,然后按 F5键运行程序。在输入文本框中输入 5,再单击 [计算阶乘 ]按钮。

( 8)观察计算结果,发现 5的阶乘等于 1,显然是不正确的。这说明阶乘计算也有错误。下面再观察求解阶乘的函数 。

( 9)关闭正在运行的程序,然后打开 [调试 ]菜单,单击 [添加监视 ]菜单项,并按图所示进行设置。单击 [确定 ]按钮,再按 F5键运行程序。在输入框重新输入 5,单击 [计算阶乘 ]按钮。

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

( 10 )程序在调用 JIECHENG 函数处中断。打开 [ 视图 ] 菜单,单击 [ 调用堆栈 ] 菜单项,打开 [ 调用堆栈 ] 窗口,如图所示,观察 J

IECHENG 函数的递归调用是否存在问题。在 [ 调用堆栈 ] 窗口中显示了当前还末执行的函数和过程。这里显示了 5 个“工程 1.FOR

M1.JIECHENG” 工程,说明 JIECHENG 函数在计算 5 的阶乘时的递归调用是正确的。再看 [ 监视 ] 窗口, JIECHENG 函数当前的返回值为 1 ,也是正确的。

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

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

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

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

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

习题一、判断题

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!” 等信息。