Sie sind auf Seite 1von 36

第14章 VB程序调试与错误处理初步

可选内容(时间:2次课,4学时)

http://www.wenyuan.com.cn/webnew/
第14章 VB程序调试与错误处理初步

 教学提示:本章主要介绍VB的程序调试技术,其
中包括VB编程过程中常见的错误类型的产生和表
现,以及利用VB提供的调试工具和语句对程序错
误进行捕获、处理和修改的方法。VB为广大用户
提供了功能强大的程序调试工具,使用户能够迅
速排除编程中出现的问题。
 本章主要介绍:VB程序错误的种类、错误处理的
方法以及程序代码调试的方法。

http://www.wenyuan.com.cn/webnew/
第14章 VB程序调试与错误处理初步

 14.1 错误的种类
 14.2 错误处理
 14.3 代码调试
 14.4 小结
 14.5 思考与练习

http://www.wenyuan.com.cn/webnew/
14.1 错误的种类

 14.1.1 语法错误

 14.1.2 运行错误

 14.1.3 逻辑错误

http://www.wenyuan.com.cn/webnew/
14.1.1 语法错误
语法错误是存在于代码中的语言结构方面的错误。比
如,拼写错误、缺少操作对象、不符合语法规则等错误都
属于语法错误。
例如,我们要输入下列代码:
Private Sub Form_Load()
Dim i As Integer
Dim j As Integer
Dim sum As Integer
sum = 0
For i = 1 To 100
For j=1 100
……
End Sub

http://www.wenyuan.com.cn/webnew/
14.1.1 语法错误
由于我们不小心将语句:For j=1 To 100书写成
For j=1 100(漏掉了To),则当用户按下Enter键的时
候,Visual Basic就会立刻测出这样的错误,会提示

用户“缺少To”,如下图所示。

http://www.wenyuan.com.cn/webnew/
14.1.2 运行错误
运行错误是指在运行程序的时候发生的错误。这些错误在编写的过
程中,因为它们符合语法规则,所以不会被识别出来,也不会在编译的
时候被发现。它们往往是由于进行了某种错误的操作造成的。
例如,下面一段代码:
Private Sub Command1_Click()
Dim number As Integer
Dim total As Double
Dim aver As Double
total = Val(Text1.Text)
number = Val(Text2.Text)
aver = total / number
Text3.Text = aver
End Sub

http://www.wenyuan.com.cn/webnew/
14.1.2 运行错误
该程序在计算平均值时,很有可能在没有提供参数number,或者
提供了不合法的值,则会产生除数为0的错误,从而引起程序的崩溃。
如下图所示:

这时,用户可以单击【结束】按钮来结束程序,也可以单击
【调试】按钮来发现是哪一条语句发生了错误,以便于修改。

http://www.wenyuan.com.cn/webnew/
14.1.3 逻辑错误
逻辑错误指的是程序可以执行,但就是得不到用
户所希望的结果。这并不是程序语句的错误,而是
由于程序设计时本身存在的逻辑缺陷而导致的。如
定义了错误的变量类型,或程序中出现了不正确的
循环次数或死循环等等。
大多数逻辑错误不容易发觉是在哪一条语句发生
的,而且错误产生的原因与产生错误结果的语句之
间可能隔有很多语句。因此,对于逻辑错误一般要
使用单步执行和监视的方法来查找错误的根源。

http://www.wenyuan.com.cn/webnew/
14.2 错 误 处 理
对于程序中可能出现的错误都要进行处理,否则会使应用程序崩溃。但
是,有的错误是用户无法避免的。例如,当光驱中没有光盘时,用户访问
了光驱,这时,系统会产生一个“设备没有准备好”的错误。
在Visual Basic中,允许使用错误处理方法来对可能出现的错误进行预先
处理。所谓错误处理,就是提供发生错误时执行的代码,也相当于是程序
运行的一部分。当一个错误发生的时候,应用程序应该可以探测到这一个
错误,并且进行相应的错误处理。用户应当在可能产生错误的地方放置错
误探测语句,同时,在同一个程序中放置错误的处理代码。通常含有错误
的探测捕捉和处理
设置错误的捕捉陷阱,即在程序中可能出现错误的地方放置捕捉语句来捕
获产生错误的语句。
编写错误处理程序,即当程序中出现错误的时候,程序将运行用户指定的
程序。
退出错误处理程序,即在处理错误之后,应该恢复原来的一些参数,然后
让程序继续正常地运行下去。

http://www.wenyuan.com.cn/webnew/
14.2 错 误 处 理

14.2.1 错误捕获

14.2.2 激活错误捕获功能

14.2.3 编制错误处理程序

http://www.wenyuan.com.cn/webnew/
14.2.1 错误捕获
当程序中的某行代码试图执行一项非法的操作时,将产生运行时
错误(Run-Time Error)。例如,当我们的程序需要打开某个特定的文件
时,如果这个文件被误删了,就会产生运行时错误“file not found”(文
件未找到),如下图所示。

再如,当我们的程序要从软盘中读取文件时,如果软驱中
没有软盘,就会产生运行时错误“Disk not ready”(磁盘没有准
备好)。

http://www.wenyuan.com.cn/webnew/
14.2.1 错误捕获
通过这些例子可以看出,运行时错误是无法避
免的。但是,一旦出现运行时错误,将造成程序崩
溃。因此,我们必须对可能发生的错误进行处理。
许多运行时的错误只能靠用户来解决,比如插入
软盘。因此,我们必须在系统发出错误之前,截获
错误,在错误处理程序中提示用户采取措施,是解
决问题还是取消操作。如果用户解决了问题(如插
入了软盘),我们的程序就能够继续执行,如果用
户选择取消操作,我们就可以跳过这段程序,而继
续执行后面的程序。
这就是处理运行时错误的方法,我们将这个过
程称为错误捕获(Error Trapping)。

http://www.wenyuan.com.cn/webnew/
14.2.2 激活错误捕获功能
在我们捕获运行时错误之前,首先要激活错误捕获功能,这项任
务是由On Error语句来完成的。On Error语句共有3种格式。
1. On Error Goto 行号
此语句的功能是激活错误捕获,并将错误处理程序指定为从“行
号”
位置开始的程序段。
例如:
Private Sub Form_Load()
Dim r As VbMsgBoxResult
On Error GoTo notready
ChDrive "A"
Exit Sub
notready:
r = MsgBox(" 请 插 入 软 盘 !", vbRetryCancel +
vbCritical, "缺少软盘")
If r = vbRetry Then Resume
End Sub

http://www.wenyuan.com.cn/webnew/
14.2.2 激活错误捕获功能
这是一个典型的错误处理过程。首先,我们可以预料到在此过程中有可
能 出 现 运 行 时 错 误 , 因 此 , 在 过 程 开 始 时 , 我 们 使 用 On Error GoTo
notready激活错误捕获功能,并指定从行号“notready”开始的程序段为错误
处理程序(注意,行号后面要加一个冒号,但在语句On Error GoTo notready
中不加冒号)。这样,当程序运行到语句“ChDrive ”A“”并发生错误时,将
执行行号“notready”后面的语句。如果不发生错误,当执行到语句“Exit
Sub”时,将退出过程。在过程退出时,错误捕获功能就自动被取消了。

2. On Error Resume Next


此语句的功能是忽略错误,继续往下执行。使用这种格式的语句,它
可以激活错误捕获功能,但并不指定错误处理程序,当错误发生时,不做
任何处理,紧接着从发生错误语句之后的语句继续执行。

http://www.wenyuan.com.cn/webnew/
14.2.2 激活错误捕获功能
例如,如下一段代码:
Private Sub Form_Load()
On Error Resume Next
ChDrive "A"
FileCopy "readme.txt", "d:\read.txt"
End Sub
这段程序的功能是拷贝“A”盘中的“readme.txt”文件到“D”盘。假设
当前驱动器是“C”盘,如果在执行语句“ChDrive ”A“”时出错,就忽略此
项操作,继续留在“C”盘。并将“C”盘当前目录下的“Readme.txt”文件
拷贝到“D”盘,如果在“FileCopy ”readme.txt“, ”d:\read.txt“”语句再出现错
误,那么干脆什么都不做自动退出此过程。
3. On Error Goto 0
此语句用来关闭错误捕获功能。当用户确定已经没有错误产生或者错
误已经得到处理,就可以关闭错误捕获功能。要注意,错误捕获功能一旦
被激活,将保持到过程结束,如果我们要在过程结束之前就关闭此功能,
应使用“On Error Goto 0”语句。

http://www.wenyuan.com.cn/webnew/
14.2.3 编制错误处理程序

在捕获到运行时错误后,接下来就是要执行错误处理程
序。在错误处理程序中,我们要针对错误的类型,向用户提
供解决的方法,然后根据用户的选择,进行相应的处理。
在Visual Basic中,每当产生错误的时候,都会将当前错
误的编号和描述存储在Err对象中。因此,我们可以通过这
个对象来判断当前产生的是什么错误。Err对象是一个具有
全局范围的固有对象,用户不必在程序中重新定义它。
Err对象最常用的属性是Number属性和Description属性。
Number属性存储当前错误的编号,Description属性存储当前
错误的描述。

http://www.wenyuan.com.cn/webnew/
14.2.3 编制错误处理程序
Visual Basic中的常见错误码及其描述如下表所示。

错误码 错误信息 错误码 错误信息


5 无效的过程调用或参数 18 出现用户中断
6 溢出 35 过程或者函数未定义
7 内存溢出 52 错误的文件名
9 数组下标越界 53 找不到指定的文件
10 数组长度固定或者临时被锁定 55 文件已经被打开
11 除数为0 61 磁盘已满
13 类型不匹配 68 设备没有准备好

http://www.wenyuan.com.cn/webnew/
14.2.3 编制错误处理程序

Number属性的出现为错误的几种处理提供了很好的方法。
根据用户不同的选择,返回的位置有所不同,如果用户解决
了问题,并选择重试,就应该返回到产生错误的语句重新执行,
如果用户选择取消操作,就应该跳过产生错误的语句,返回到它
的下一行语句继续执行。
从错误处理程序中返回时,我们使用Resume语句。根据不同
的返回位置,Resume语句可分为3种:
 Resume 0:返回到产生错误的语句重新执行。“0”可以省略。
 Resume Next:跳过产生错误的语句,返回到它的下一行语句继
续执行。
 Resume 行号:返回到行号指定的位置继续执行。

http://www.wenyuan.com.cn/webnew/
14.2.3 编制错误处理程序
下面我们来看一个例子:
Private Sub Form_Load()
Dim r As VbMsgBoxResult
On Error GoTo eh
ChDrive "A"
FileCopy "readme.txt", "d:\readme.txt"
Exit Sub
eh:
Select Case Err.Number
Case 71
r = MsgBox(" 请 插 入 软 盘 !", vbRetryCancel +
vbCritical, "缺少软盘!")
If r = vbRetry Then
Resume
Else
Resume Next
End If
Case 53
r = MsgBox(" 找 不 到 文 件 , 请 将 文 件 恢 复 后 重 试 .",
vbRetryCancel + vbCritical, "缺少文件!")
If r = vbRetry Then Resume
End Select
End Sub

http://www.wenyuan.com.cn/webnew/
14.2.3 编制错误处理程序
我们通常使用Select Case语句来判断错误的类
型。在这个例子中,“磁盘没有准备好”是71号错误,
“找不到文件”是53号错误。对于不同的错误类型,程
序将向用户提示不同的信息。在这个例子中,对于“磁
盘没有准备好”的错误,程序将向用户提示插入软盘,
当用户单击“重试”按钮时,程序使用Resume语句返回
到产生错误的行“ChDrive "A"”。如果这时用户已经插
入软盘,这行语句将不会再产生错误,因此程序将继续
执行。如果用户单击“取消”按钮,程序将使用Resume
Next 语 句 返 回 到 产 生 错 误 的 下 一 行 “ FileCopy
"readme.txt", "d:\readme.txt"”继续执行。

http://www.wenyuan.com.cn/webnew/
14.3 代 码 调 试
有时,程序中不存在语法错误或运行时错误,也没
有执行非法操作的语句,但是程序运行的结果却是不
正确的。我们称这种错误为逻辑错误。例如,使用了
错误的公式或局部变量与全局变量混用了等。

程序运行时对于逻辑错误并没有任何的提示,我
们只能深入到程序的内部,一步步地执行程序,观察
程序的执行过程,从而找出隐藏在程序中的逻辑或运
行时错误。我们将这个过程称为调试。调试是一种查
找错误的手段,而不是处理或改正错误的手段。

http://www.wenyuan.com.cn/webnew/
14.3 代 码 调 试
Visual Basic为用户提供了功能强大的调试工
具,对于错误程序的更正有很大的帮助,而且可以跟
踪程序的执行过程。调试工具包含【设置断点】、【
单步执行】、【显示变量内容】等。下面,我们就来
学习一下,如何利用Visual Basic为用户提供的调试
工具来调试程序。首先,单击【视图】菜单中的【工
具栏】命令,打开【调试】工具栏。如下图所示。

http://www.wenyuan.com.cn/webnew/
14.3 代 码 调 试

14.3.1 中断程序的执行

14.3.2 跟踪操作

http://www.wenyuan.com.cn/webnew/
14.3.1 中断程序的执行

中断程序的执行是指当程序运行到某一行语句
时,就进入中断状态,不再继续执行。这样我们
就可以在中断状态下调试程序。常用的方法是通
过设置断点来实现,下面我们来看看有关断点的
操作。
1. 设置断点
将插入点放在要设置断点的行,然后使用下
述操作之一便可为该行设置断点:
选择【调试】菜单中的【切换断点】命令。
单击调试工具栏中的按钮。
按F9键。

http://www.wenyuan.com.cn/webnew/
14.3.1 中断程序的执行
为某一行设置了断点后,该行代码将以红底白字显示,并在
边界指示条中出现一个红色的圆圈,表示这一行代码已被设置了断
点。如图14.5所示。

2. 清除断点
对已设置断点的行,再执行和上面相同的操作便可清除断点。
3. 清除所有断点
选择【调试】菜单中的【清除所有断点】命令。或按【Ctrl+Shift+F9】键。

http://www.wenyuan.com.cn/webnew/
14.3.2 跟踪操作
1. 逐语句执行
此项操作是逐条语句地执行代码,即每次运行一行代码。当进入到过程
中时,也将在该过程中逐条语句执行代码。如果Visual Basic正在等待应该
事件的发生,就不会执行任何语句。
逐条语句执行代码有下面3种方法。
选择【调试】菜单中的【逐语句】命令。
单击调试工具栏中的 按钮。
按F8键。
当逐语句执行代码时,执行点将移动到下一行,且该行将以黄底黑字
显示,而且,在边界指示条中还会出现一个黄色的箭头。如下图所示。

http://www.wenyuan.com.cn/webnew/
14.3.2 跟踪操作
2. 逐过程执行
此项操作单步执行代码,如果碰到过程调用,则不进入该过程,也
就是说,将过程调用看作一行语句来执行。
逐过程执行代码有下面3种方法。
 选择【调试】菜单中的【逐过程】命令。
 单击调试工具栏中的 按钮。
 按Shift+F8键。
3. 跳出过程
此项操作将当前过程中执行点后面的语句全部执行,并将下一执行点
定位在调用该过程的语句的下一行。
跳出过程有下面3种方法。
 选择【调试】菜单中的【跳出】命令。
 单击调试工具栏中的 按钮。
 按Ctrl+Shift+F8键。

http://www.wenyuan.com.cn/webnew/
14.3.2 跟踪操作

提示:
如果在执行点后面的语句中存在断点,那么跳出过
程命令将使程序执行到下一断点。也就是说,断点的
级别要高于跳出过程命令。

Visual Basic的程序调试技术和错误处理技术是相
当完善的,本章只是简单地介绍了程序调试和错误处
理的初步知识,目的是为了让用户掌握调试程序的基
本方法,并养成良好的编程习惯,为日后的学习和工
作打下良好的基础。

http://www.wenyuan.com.cn/webnew/
14.4 小 结

http://www.wenyuan.com.cn/webnew/
14.4 小 结
(1) 常见的错误有“语法错误”、“运行时错误”和“逻辑错误”。
(2) 语法错误是存在于代码中的语言结构方面的错误。运行错误是指
在运行程序的时候发生的错误。而逻辑错误则不同,它指的是程
序可以执行,但就是得不到用户所希望的结果,这是由于程序设
计时本身存在的逻辑缺陷而导致的。
(3) 所谓错误处理,就是提供发生错误时执行的代码,通常包含有错
误的探测捕捉和处理,即设置错误的捕捉陷阱、编写错误处理程
序和退出错误处理程序。
(4) 所谓错误捕获就是我们必须在系统发出错误之前,截获错误,在
错误处理程序中提示用户采取措施,是解决问题还是取消操作。
激活错误捕获功能一般有3种格式:On Error Goto 行号 、On
Error Resume Next、On Error Goto 0

http://www.wenyuan.com.cn/webnew/
14.4 小 结

(5) 在编制错误处理程序中,我们要针对错误的类型,向用户提供解
决的方法,然后根据用户的选择,进行相应的处理。一般我们可
以利用Err对象的Number属性和Description属性的值编制错误处
理程序,
(6) Visual Basic为用户提供了功能强大的调试工具,利用它可以跟
踪程序的执行过程,包含【设置断点】、【单步执行】、【显示
变量内容】等等,

http://www.wenyuan.com.cn/webnew/
14.5 思考与练习
1、选择题
(1) 当语句不符合文法规则时,出现 错误。
A. 逻辑错误 B. 运行时期错误 C. 语法错误 D. 以上都不对
(2) 下列陈述中正确的有 。
A. 中断点只能在设计过程中设置。
B. 中断点只能在执行过程中设置。
C. 中断点可以在设计过程中设置,也可以在执行过程中设置。
D. 中断点可以在设计过程中设置,也可以在执行过程或中断过程
中设置。
(3) 下列属性中,属于Err对象的有 。
A. Number B. Caption C. Description D. Text

http://www.wenyuan.com.cn/webnew/
14.5 思考与练习
2、判断题
(1) 在VB集成环境中只有运行程序才能发现程序错误。 ( )

(2) 设置错误的捕捉陷阱,指在程序中可能出现错误的地方放置捕捉语句
来捕获产生错误的语句。 ( )

(3) On Error Resume Next语句的功能是忽略错误,继续往下执行。( )


3、填空题
(1) 设置断点快捷键是 。
(2) VB单步执行的热键是 。
(3) 错误码为11表示发生的错误是 。

http://www.wenyuan.com.cn/webnew/
14.5 思考与练习
4、操作题
(1)编写一段程序,如果出现数组下标越界或除数为零错误时,则给
出错误的描述。
(2)编写一段程序,要求能够对下列代码中的错误进行捕捉处理。
For i=1 To 10
For j=1 To 10
a(i,j)=100/(i-j)
Next j
Next i
(3)编写向软盘拷贝文件的程序,要求使用错误捕捉的方法,对当软
盘不存在,或存储空间已满的异常情况进行处理。

http://www.wenyuan.com.cn/webnew/
Q & A?

Thanks!

http://www.wenyuan.com.cn/webnew/

Das könnte Ihnen auch gefallen