第9章 程序调试.ppt_第1页
第9章 程序调试.ppt_第2页
第9章 程序调试.ppt_第3页
第9章 程序调试.ppt_第4页
第9章 程序调试.ppt_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第9章 程序调试,引言 9.1 程序可能发生哪几类错误 9.2 如何调试程序 9.3 如何捕获和处理错误,结束,引言 (1),在编写程序中难免会出现错误,从而导致程序不能运行,或能够运行却得不到正确的结果。如何跟踪、避免和解决错误,是程序开发人员面临的不可回避的问题。本章介绍VB程序的调试和错误处理。 首先给出一个简单的程序:输入6个整数,求出其中的最大值。解决此问题的正确代码如下,可以将它们放在窗体的Click事件中。为了便于说明问题,我们称之为“示例程序”,并在每行前增加了表示行号的数字。在后面的叙述中将多次引用该示例。,引言 (2),Private Sub Form_Click() 1

2、Dim a(5) As Integer 2 Dim i As Integer 3 Dim max As Integer 4 For i = 0 To 5 5 a(i) = Val(InputBox(输入一个整数) 6 Next i 7 max = a(0) 8 For i = 1 To 5 9 If max a(i) Then max = a(i) 10 Next i 11 For i = 0 To 5 12 Print a(i) 13 Next i 14 Print MAX=; max End Sub,返回首页,9.1 程序可能发生哪几类错误,9.1.1 编译错误 9.1.2 逻辑错误 9.

3、1.3 运行异常错误,返回首页,9.1.1 编译错误 (1),违背VB语法规定,不正确地书写代码,会造成编译错误,这是最常见的错误类型。例如输入了拼写错误的关键字,遗漏了某些必要的标点符号,使用了For语句但没有Next语句与之对应,调用函数没有提供必要的参数,等等。 VB提供的“自动语法检测”功能能够自动检测到编译错误,并终止程序的运行。在“示例程序”中,如果在输入第5行时,将InputBox函数的参数中第二个双引号误输成中文双引号,即第5行变为: a(i) = Val(InputBox(输入一个整数”),9.1.1 编译错误 (2),则运行程序时就会出现编译错误,VB自动检测到该错误并弹出

4、错误信息,如图9.1所示。 在程序中不恰当地使用变量,也会引发编译错误。,按照VB的规定,变量可以不经声明而直接使用,但当程序规模较大时,变量的使用混乱可能造成错误,且不易被发现。为此,可以强制进行变量的显式声明,即在程序代码的“通用-声明”段中加入语句:Option Explicit。,图9.1 编译错误,9.1.1 编译错误 (3),要使以后新建的窗体均自动加入该语句,可选择【工具】菜单中的【选项】,在弹出的对话框的【编辑器】选项卡中选中【要求变量声明】。强制变量显式声明后,VB将自动检查是否有未定义的变量,发现后将显示错误信息。,在“示例程序”中的第2行定义了循环变量i。如果已经有了Op

5、tion Explicit语句,再删除第2行,则运行程序时会出现图9.2所示的错误信息。,图9.2 变量未定义,返回首页,返回本节,9.1.2 逻辑错误,程序运行时没有按照预期的方式去执行,或者没有得到预期的结果,我们说程序发生了逻辑错误。从语法的角度来看,代码是正确的,运行过程也顺利,但是却产生了不正确的结果,其原因是程序中的处理逻辑出现了错误。 例如,“示例程序”应该求出一个最大值,若将第九行中的“”,则求出的是最小值,显然这不是我们要求的结果。 要检验程序是否含有逻辑错误,可以人工检查代码,亦可进行程序测试,设定一组特定的甚至是苛刻的操作或数据,测试程序的执行情况和运行结果。,返回首页,

6、返回本节,9.1.3 运行异常错误 (1),程序运行时,当一个语句试图执行一个不能执行的操作时,就会发生运行异常错误(实时错误)。例如,某些系统硬件问题,意料之外的数组下标越界,除法运算中除数为0,试图读取未准备好的磁盘文件等等,均会引起运行异常错误。 例如,将“示例程序”中第4行循环语句改为: For i = 0 To 6 则VB编译时不会发现其中的错误,而且还能够生成可执行程序(.EXE),但在运行中会出现图9.3所示的错误信息。,9.1.3 运行异常错误 (2),图9.3 运行异常错误,9.1.3 运行异常错误 (3),运行异常错误会导致程序突然异常终止而无法恢复运行,为了避免这种情形的

7、出现,在代码中可以用VB的错误处理语句捕获并中断错误,转而执行正确的操作。 在上述三类错误中,编译错误最为简单,也最容易发现和处理,只要根据编译时提供的错误信息进行修改就可以了。只要存在编译错误,应用程序也就不可能运行起来。而对其他两类错误的处理就要复杂的多,需要花一番功夫。本章后面将介绍如何处理逻辑错误和运行异常错误。,返回首页,返回本节,9.2 如何调试程序,9.2.1 设置运行断点 9.2.2 使用调试窗口 9.2.3 单步调试和跳跃调试,返回首页,9.2.1 设置运行断点 (1),在设计状态,可以改变应用程序的设计和代码,但却不能立即看到这些变更对程序运行所产生的影响;在运行程序时,可

8、以观察到程序的运行状态,但却不能直接改变代码。通过设置运行断点,VB系统可以中止程序的运行,使得程序进入到中断模式。在中断模式下,系统保留着发生中断时的运行状态,包括各个变量和属性的设置值,供用户观察、分析,同时,允许直接修改应用程序的代码,影响程序的运行。 设置运行断点通常有两种方法:在代码窗口中单击最左边的灰色区域,使之出现一个棕色标志,对应的代码行被同时加亮,则此处便设置了一个断点。将光标移动到要设置断点的代码行,打开【调试】菜单,选择【切换断点】,亦可设置一个断点。图9.4表示设置了两个断点的情况。,9.2.1 设置运行断点 (2),图9.4 设置断点,要清除已经设置的断点,只需将上述

9、操作重复一次,断点便被撤销。也可以打开【调试】菜单,选择【清除所有断点】。,9.2.1 设置运行断点 (3),VB允许在一行上有多条语句,其间用冒号(:)分隔。在这种具有多条语句的行上,断点只被设置在第一条语句上。 另外,在代码中使用Stop语句,也可以设置一个断点。 程序运行到所设置的断点时,自动停止运行,并且不执行包含断点的代码行,进入中断模式。此时,将光标移动到某个变量或表达式上,系统会立即显示出该变量或表达式的当前值,如图9.5所示。,9.2.1 设置运行断点 (4),图9.5 在断点处中断运行,9.2.1 设置运行断点 (5),选择【运行】菜单中的【继续】,程序可以继续执行,直到程序

10、结束或再次遇到断点。 通过观察变量或表达式的当前值,了解其在代码前后的变化情况,就可以发现许多存在的问题和错误。某些错误是由于输入代码时的疏忽造成的,例如写错了变量名称、使用了对象不支持的属性或方法等等,因为在中断模式下可以直接修改代码,所以这类错误很容易得到更正。当更正或改变了代码后,继续运行程序便可以验证问题或错误是否得到了解决或纠正。,返回首页,返回本节,9.2.2 使用调试窗口(1),有些问题和错误往往需要通过对数据的变化进行分析才能发现。当程序处于中断模式下时,可以使用三个调试窗口来监视变量或表达式的值,它们是:【立即】窗口、【监视】窗口和【本地】窗口。打开它们的菜单命令均位于【视图

11、】菜单下。 1.【立即】窗口 【立即】窗口显示正在调试的代码产生的信息。可以直接在该窗口中键入命令请求这些信息,如图9.6所示,也可以在程序中使用Debug.Print语句输出某些变量和表达式的值到【立即】窗口。,9.2.2 使用调试窗口(2),【立即】窗口是调试程序时使用最多的窗口。它最容易使用,功能也最强。使用该窗口可以实现以下功能:,(1)检查某个属性或变量的值,或对表达式求值。例如: ? i; a(i); max; a(i) * a(i 1) ? Text1.Text,9.2.2 使用调试窗口(3),(2)为变量或属性设置新值。例如: i = 5: a(i) = 10: Text1.T

12、ext = 张三 (3)测试过程。可以指定参数来调用过程。例如,假设有一个函数过程Sum(n%)用于求1n之和,可用以下方法测试: a = 10: b = 20 ? Sum(a); Sum(b),9.2.2 使用调试窗口(4),2. 【监视】窗口 【监视】窗口显示当前的监视表达式的信息,如图9.7所示。在【监视】窗口中,【上下文】列出监视表达式所在的过程或模块,只有当前语句在指定的上下文中时,【监视】窗口才能显示出监视表达式的值,否则,其【值】列只显示一条消息,指出语句不在上下文中。,图9.7 【监视】窗口,9.2.2 使用调试窗口(5),要添加一个监视表达式到【监视】窗口,执行【调试】菜单中

13、的【添加监视】命令,打开如图9.8所示的【添加监视】窗口。在【表达式】框中输入需要监视的变量或表达式,通过设置【上下文】指定监视的范围,还可以设定监视类型。添加了监视之后,随着程序的执行,【监视】窗口中的变量或表达式会同步更新。,9.2.2 使用调试窗口(6),图9.8 添加监视表达式,9.2.2 使用调试窗口(7),3. 【本地】窗口 【本地】窗口显示当前过程中所有变量的值,如图9.9所示。当程序从一个过程切换到另一个过程时,【本地】窗口的显示内容会相应改变,它只反映当前过程中可用的变量。,图9.9 【本地】窗口,返回首页,返回本节,9.2.3 单步调试和跳跃调试(1),程序遇到断点便进入中

14、断模式,因此,中断时含有断点的代码行还没有被执行。如果要观察断点所在的行以及其后语句行的执行情况,可以使用“逐语句”功能进行单步运行。 使用F8快捷键,或者使用【调试】菜单中的【逐语句】,都可以进行单步运行。单步运行时,程序每次执行一行代码,然后继续等待,我们便可以观察到该步执行后的运行状态。反复使用“单步运行”功能,就可以对程序执行的每一步进行全面跟踪。,9.2.3 单步调试和跳跃调试(2),如果当前代码行调用了一个过程,则利用“逐语句” 功能可以跟踪到过程的内部,了解该过程是如何被执行的。 使用ShiftF8快捷键,或者使用【调试】菜单中的【逐过程】,也可以进行单步运行。与“逐语句”功能的

15、区别是,当被执行的代码行调用一个过程时,“逐过程”功能不向过程的内部跟踪,它把过程调用视为一个整体单元来执行,然后到达过程执行后的下一条语句。例外的情况是,被调用的过程中含有断点,则即便是“逐过程”方式,程序仍然会在过程内的断点处中断。,9.2.3 单步调试和跳跃调试(3),使用【调试】菜单中的【运行到光标处】(快捷键CtrlF8),可以使程序直接运行到光标所在的代码行,然后进入中断模式。这相当于连续执行了多次的单步运行,可以快速通过某些不需要调试的代码行。 使用【调试】菜单中的【设置下一条语句】(快捷键CtrlF9),可以不执行部分代码行,直接绕过它们,到达下一个要调试的代码行,该行既可以位

16、于当前断点之后,也可以位于当前断点之前。,返回首页,返回本节,9.3 如何捕获和处理错误,9.3.1 设置错误捕获 9.3.2 编写错误处理程序 9.3.3 退出错误处理程序 9.3.4 关于Err对象 9.3.5 如何避免错误,返回首页,9.3.1 设置错误捕获 (1),1. On Error GoTo line 语句 当错误发生时,该语句捕获错误,并使得程序转移到由标号line指示的错误处理程序处去执行。相应地,错误处理程序也以一个相同的标号开始,从而激活错误处理。 标号是一种标识符,其命名方式和变量的命名一样,以字母开始,以冒号结束。On Error语句中的标号可以带也可以不带冒号,但标

17、号所指示的位置必须是与On Error GoTo语句同一过程中的一个语句。,9.3.1 设置错误捕获 (2),例如,若“ErrorHandler:”是一个标号,则On Error语句为如下形式: On Error GoTo ErrorHandler 或: On Error GoTo ErrorHandler: 2. On Error Resume Next 语句 当错误发生时,使程序转移到发生错误的语句之后的语句,并在此继续运行。这相当于不中断代码的执行,也不转移到别的代码上去执行,而是忽略了所发生的错误。这种情况下不需要编写错误处理程序。,9.3.1 设置错误捕获 (3),3. On Err

18、or GoTo 0 语句 取消错误捕获。对当前过程中的错误捕获由On Error语句启动,当退出本过程时,自动取消错误捕获。可以使用 On Error GoTo 0 语句取消对当前过程中的错误捕获。,返回首页,返回本节,9.3.2 编写错误处理程序(1),错误处理程序含有实际处理错误的代码,与On Error语句在同一个过程中。它不是一个过程,而是一个程序段,因此也常称之为错误处理例程、错误处理代码。 编写错误处理程序的第一步是添加标号,标号标志着错误处理程序的开始,标号后面必须带有冒号。这个标号也就是在On Error GoTo语句中使用到的标号。 通常,将错误处理程序放置在过程的末端,并在

19、标号所在行的上一行中增加语句Exit Sub或Exit Function等,以便在没有错误发生时,避免执行错误处理代码。,9.3.2 编写错误处理程序(2),例如,一个含有错误处理程序的通用过程TestError形式如下: Sub TestError() On Error GoTo ErrorHandler Exit Sub ErrorHandler: 错误处理代码位于此处 End Sub,返回首页,返回本节,9.3.3 退出错误处理程序(1),在错误处理程序内,可使用下列语句退出错误处理程序。 (1)Resume 语句:使程序返回到导致错误的那条语句上重新执行。 (2)Resume Next

20、语句:使程序返回到导致错误的语句之后的那条语句上开始执行。 (3)Resume line语句:使程序转移到由标号line指示的位置上执行。 通常,若错误在错误处理程序内得以修正,可以使用Resume 语句,否则,若错误处理程序不能修正所出现的错误,则可以使用Resume Next语句。,9.3.3 退出错误处理程序(2),【例9.1】设计一个进行除法运算的简单程序,运行界面如图9.10所示。在第一个文本框Text1中输入被除数,在第二个文本框Text2中输入除数,单击命令按钮CmdAdd(“运算”)时,在第三个文本框Text3中显示结果。 代码如下: Private Sub CmdAdd_Cl

21、ick() Text3.Text = Val(Text1.Text) / Val(Text2.Text) End Sub 正常的运算中一般不会出现问题,但当在Text2中输入的除数为0时,将导致错误,使程序异常终止,显示如图9.11所示的错误信息。,9.3.3 退出错误处理程序(3),图9.10 例9.1运行结果 图9.11 除数为0的错误信息 现在考虑错误处理,为上述代码增加错误捕获和处理的功能,改变成如下形式:,9.3.3 退出错误处理程序(4),Private Sub CmdAdd_Click() On Error GoTo Error1 开始捕获错误 此语句可能引发错误 Text3.T

22、ext = Val(Text1.Text) / Val(Text2.Text) Exit Sub Error1: 进行错误处理 Text3.Text = 无效 返回到语句Exit Sub上执行 Resume Next End Sub 经过上述处理后,当Text2中的除数为0时,程序不会异常终止,如图9.12。,9.3.3 退出错误处理程序(5),【例9.2】读写软盘中的文件时,如果软驱中没有插入软盘,将引起错误。此时也需要捕获错误并进行处理: Private Sub cmdOpenFile() On Error GoTo Error2 开始捕获错误 此语句可能引发错误 Open a:test.

23、txt For Output As #1 Exit Sub Error2: 进行错误处理 If MsgBox(可能没有插入软盘, vbRetryCancel) _ = vbRetry Then Resume 若单击“重试”按钮,返回到Open语句重新执行 End If End Sub,返回首页,返回本节,9.3.4 关于Err对象 (1),在例9.2中,引起错误的原因也许不是软驱中没有插入软盘,其他很多原因都有可能引起软盘读写错误,因此尽管处理了错误,但并不十分有效。要编写有效的错误处理代码,则应该了解VB中的Err对象。 Err对象是一个VB运行期对象,它包含了关于最新的错误信息,可以帮助确

24、定发生的错误类型、原因和错误发生的地方。当程序运行时遇到一个错误,或者当我们使用Err对象的Raise方法故意引发一个错误时,系统便设置Err对象的属性。,9.3.4 关于Err对象 (2),以下简要介绍Err对象的主要属性和方法。 1. Number属性 用于标识错误的错误编号。例如,“6”表示数据溢出,“7”表示内存溢出,“11”表示除数为0,“9”表示下标越界,“71”表示磁盘未准备好,等等。 2. Source属性 当前VB应用程序的名字。,9.3.4 关于Err对象 (3),3. Description属性 表义性的错误信息。如果某个错误没有这个字符串型的错误信息,该属性就会指明“应用程序定义或对象定义错误”。 4. Clear方法 在错误处理后清除Err对象的所有属性的值。当退出过程时,系统会自动清除Err对象的属性值,若要显式地清除,则可调用Clear方法。,9.3.4 关于Err对象 (4),5. Raise方法 这个方法用来产生一个错误。它是在测试和评估的时候使用的,这样可以主动地产生错误,以便使程序中的错误处理程序对它进行处理。其简化的语法格式为: Err.Raise numb

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论