程序调试的主要任务:查找程序的错误和排除错误
本章主要内容
VB
错误处理
第 9章 程序调试与错误处理
三类错误类型,编译错误,逻辑错误和运行错误
1,编译错误
编译错误是指在程序编译过程中出现的错误。通常是
由于不正确书写代码而产生的。
例如:关键字写错,遗漏标点符号,括号不匹配等。
较为容易。 VB提供了自动语法检查功能,能指出并显
示这些错误,帮助用户纠正语法错误。
例子,Foor t = 1 To 100
9.1 VB程序中的错误类型
2,运行错误
运行时的错误是指应用程序在运行期间执行了非法操作
所发生的错误。
例如,除法运算中除数为零,访问文件时文件夹或文
件找不到等。这种错误只有在程序运行时才能被发现。
举例 (“下标越界” ):
Private Sub Form_Load()
Dim D(20) As Integer,k As Integer
For k=1 To 30
D(k)=k*K
Next k
End Sub
3,
逻辑错误使程序运行时得不到预期的结果 。这种程序没有
语法错误,也能运行,但却得不到正确的结果。
例如,在一个算术表达式中,把乘号,*”写成了加号
,+”,条件语句的条件写错,循环次数计算错误等
例如,要求 10!
Private Sub Form_Load()
Dim t As Integer
For i=1 To 10
t=t*i
Next i
Show, Print t
End Sub
运行程序时输出的结果是 0
通常,调试程序过程中所花的大部分时间和精力都在逻辑
错误上
三种工作模式,设计模式、运行模式 和 中断模式
1.设计模式
在设计模式下,可以建立应用程序的用户界面,设置控
件的属性,编写程序代码等
2,运行模式
在运行模式下,可以测试程序的运行结果,可以与应用
程序对话,还可以 查看程序代码,但不能修改程序
3,中断模式
在中断模式下,可以利用各种调试手段检查或更改某些
变量或表达式的值,或者在断点附近单步执行程序,以便发
现错误或改正错误
9.2 程序工作模式
进入中断模式的方法:
(1)在代码中插入 Stop语句;
(2)在代码窗口中设置断点 (用菜单命令 );
(3)在代码窗口中设置断点 (鼠标操作 );
(4)在程序运行时强制“中断”;
(5)当程序运行出现错误。
当检查调试通过后,需要清除断点
程序调试一般包括 静态检查 和 动态检查
9.3.1 静态检查与动态检查
静态检查 程序的基本方法是 逐行逐句地读程序,弄清楚每
条语句的作用,预见每条语句和模块的执行结果,判断是否与
预期结果相一致,这就是静态检查,也称人工检查。
静态检查无误后,就可以进行更有效的 动态检查 。 通过上
机调试来发现错误 称为动态检查。
动态检查的基本方法是输入一组典型的数据来运行程序。
程序对这些数据处理结果应是已知的,通过运行后实际结果和
预想结果相比较,可以判断程序的正确性
9.3 程序调试
例如,为了检验求解一元二次方程 ax2+bx+c=0的程序 (见第
四章例 4.5)是否正确,我们可以输入以下 四组 a,b,c的数值:
第一组,0,1,1
第二组,1,-2,1 预期结果,x1=1,x2=1(两个相等实根 )
第三组,1,1,-2 预期结果,x1=1,x2=-2(两个不等实根 )
第四组,1,2,2 预期结果,x1=-1+i,x2=-1-i(两个共轭复根 )
动态检查中,通常在一些敏感点处设置断点,检查一些变
量或表达式的值。
使用“调试”菜单或“调试”工具栏
1.切换断点
“切换断点”按钮用来设置断点
2,逐语句
VB允许逐条语句执行程序,每执行一条语句后就返回
中断模式。
如果执行的是过程调用的代码 (如 Call),“逐语句”操
作也会跟踪到被调过程中继续一条语句一条语句的执行
3,逐过程
逐过程执行是以整个函数或过程为一个整体,一次执
行。逐过程与逐语句一样,能够一条语句一条语句地执行代
码。把被调用的函数或过程当作一个语句来看待
9.3.2 使用 VB调试工具
4,跳出
单击“调试”工具栏上的“跳出”按钮,则 VB将连续
执行完该过程的其余部分,返回调用过程的下一条语句并回
复中断模式
5,
Me代表当前窗体;单击,+”号或,-”号
6,立即窗口
可以检查某个属性或者变量的值,也可以对表达式求值,
或为变量或属性赋值等
7,监视窗口
对用户定义的表达式进行监视
例 9.1 运行以下的窗体装载事件过程,
Private Sub Form_Load()
Dim a%
a% = 5,a = 5.4
c = 1 / (a - a%)
End Sub
运行时出错,消息框提示发生,除数为零,的错误。
单击消息框中的“调试”按钮,即可进入中断模式,VB在代
码窗口中用箭头指示发生错误的语句,C=1/(a-a%)” 。
在立即窗口中键入以下命令来检查变量的值:
a,a% ′?是 Print的简写
出错前变量 a的当前值为整数 5,而不是 5.4,故发生了“除数
为零”的错误
例 9.2 计算 t = 0.1 + 0.2 + 0.3 + …… + 0.9 + 1
编写的程序代码如下:
Private Sub Form_Load()
Show
Dim t As Single,i As Single
t = 0
For i = 0.1 To 1 Step 0.1
t = t + i
Next i
Print "总和,"; t
End Sub
运行结果为:
总和,4.5
这不是正确的答案,正确结果应是 5.5
(1)在代码窗口中设置断点 。为了了解循环过程中变量 i和
t的变化情况,可在语句 t = t + i 处设置断点。
(2)重新运行程序 。程序在断点处中断运行,进入中断模式
(3)单击“调试”工具栏上的“本地窗口”按钮,利
用本地窗口来 监视过程中各量及属性值的变化情况
(4)单击“调试”工具栏上的“逐语句”按钮,让程序 单
步执行 。
(5)连续单击“逐语句”按钮,使程序在 For语句 循环执
行 9次,此时本地窗口显示的变量值如图 9.7所示
(6)再次单击“逐语句”按钮。程序不再继续循环,而
是退出循环,去执行 Next i下一个的 Print
可以发现 上述循环语句只是循环 9次 。本来应该循环 10
次,但由于小数点在机器内存储和处理会发生微小误差,当
执行到第 9次循环时,循环变量 i的值为 0.9000001,再加上步
长值 0.1时,已经超过 1,往下就不再执行循环体了。所以实
际上才循环 9次,即只计算 0.1 + 0.2 + 0.3 + … + 0.9(=4.5)
当步长值为小数时,为了防止丢失循环次数,可将 终值
适当增加
For i=0.1 To 1.05 Step 0.1
调试程序往往比写程序更难
由于应用环境等的改变,有时程序还会出现错误。例如文
件未找到等。这类“运行时错误”并非致命的错误。
对于这些可预见的错误,可以利用 VB的错误处理程序捕
获它,对其进行适当的处理,并使程序继续执行。这样就能够
使开发的软件具有更强的适应性。
9.4.1 错误处理的步骤
(1)利用 Err
(2)
(3)在“错误处理程序段”内,根据具体错误进行处理,如
果问题有解决方法,则在处理后返回原程序某处继续执行,否
则,停止程序执行
9.4 错误处理
Err对象是全局性的固有对象,用来保存最新的运行时
错误信息,其属性由错误生成者设置
1,
(1)Number属性:为数值类型,范围为 0~ 65535,保存错
(2)Source属性:为字符串,指明错误产生的对象或应用
(3)Description属性:为字符串,用于记录简短的错误信
2,
(1)Clear方法:用于清除 Err
(2)Raise
例如,执行语句 Err.Raise 55将产生 55号运行时错误,即
“文件已打开”错误
9.4.2 Err对象
使用 On Error
On Error 标号
通常,该语句放置在过程的开始位置。在程序运行过程中,
当该语句后面的代码出错时,则程序就会自动跳转到标号所指
定的程序行去运行
标号所指示的程序行通常为错误处理程序段的开始行
一个使用错误处理的示例:
On Error GoTo ErrLine ?以后出错时转移至 ErrLine
.,,
ErrLine,‘标号
.,,
Resume ?返回语句
9.4.3 捕获错误语句 (On Error)
当指定的错误处理完成后,应该控制程序返回到合适的位
置继续执行。
返回语句 Resume有三种用法:
(1)Resume [0]:
(2)Resume Next:
(3)Resume 标号,程序返回到标号处继续执行。
9.4.4 退出错误处理语句 (Resume)
输入某个数,求该数的平方根。当用户输入负数时,使
用 On Error...Resume进行处理
Private Sub Form_Load()
Dim x As Single,y As Single,i As String
On Error GoTo errln '以下出错时转移到 errln
Show, i = "" ?i 为实数标记
x = Val(InputBox("请输入一个数 "))
y = Sqr(x)
Print y; i, Exit Sub ?显示及退出过程
errln,'标号
If Err.Number = 5 Then '本错误的错误码为 5
x = -x '转换为正数
i = "i" '复数标记
Resume '返回
Else '其他错误处理
MsgBox ("错误发生在 " & Err.Source & ",代码为 " & _
Err.Number & ",即 " & Err.Description)
End
End If
End Sub
例 9.3 错误处理程序示例
程序运行时,当用户输入一个 正数 时,则显示出该数的
平方根;如果输入的是一个 负数,则因求负数的平方根 (通
过函数 Sqr())而出错,此时会 跳转到错误处理程序段 。
在错误处理程序段中,先判断错误码,若是 5(即发生求
负数的平方根的错误 ),则将该负数转换为正数,设置复数
标记,然后 执行 Resume语句返回到原出错处继续执行 。
如果发生的不是错误 5,则显示有关信息后强制结束