790 likes | 913 Views
调试与错误分类. 新教材 第 9 章. 9.1 程序错误分类 9.1.1 编译错误 编译错误多数是因为不正确的代码产生的,即在编写程序时写了有错误的语法代码,从而导致 VB 编译器无法正确解释源代码而产生错误,一般包括关键字拼写错误、标点符号遗漏,语句搭配不当等。比如以下代码,将 Dim 错误地写成了 Dimm ,就会产生编译错误。 Private Sub From_Load Dim Mystr As String Dimm I As Integer End Sub.
E N D
调试与错误分类 新教材 第9章
9.1 程序错误分类 9.1.1 编译错误 编译错误多数是因为不正确的代码产生的,即在编写程序时写了有错误的语法代码,从而导致VB编译器无法正确解释源代码而产生错误,一般包括关键字拼写错误、标点符号遗漏,语句搭配不当等。比如以下代码,将Dim错误地写成了Dimm,就会产生编译错误。 Private Sub From_Load Dim Mystr As String Dimm I As Integer End Sub
9.1.2 实时错误 实时错误是指应用程序出现期间,一条语句试图执行一条不可能执行的操作而生的错误。例如下面的语句: Private Sub Form_Load() x = 0: y = 100 Print y / x End Sub 这段语句在语法上是正确的,VB编译器不能检测出错误,因此不会产生编译错误。但等到实际运行时,当除数Number等于0时,就会出现实时错误。
9.1.3 逻辑错误 逻辑错误是指程序的运行结果和程序员是设想有出入时产生的错误。这类错误并不导致程序在编译期间出现错误,较难发现,验证程序是否存在逻辑错误的唯一方法就是将运行结果与设计方案进行对照比较。比如你想用以下格式显示一段诗:
程序员用下列语句实现上述设计: Private Sub Form_Load() MsgBox "床前明月光,疑是地上霜;" + _ "举头望明月,低头思故乡。", vbOKOnly, _ "静夜思" End Sub结果出现逻辑错误。
正确的语句应为: Private Sub Form_Load() MsgBox "床前明月光,疑是地上霜;" + Chr(13) + _ "举头望明月,低头思故乡。", vbOKOnly, _ "静夜思" End Sub 注意:逻辑错误通常不会产生消息提示。
P226 习题 一、问答题 5. VB程序错误大体可分为哪几种,它们的含义是什么? 答:VB程序错误大体分为三种:编译错误、实时错误和语法错误。 编译错误是在编写程序时书写了有错误的语法的代码,导致VB编译器无法正确解释源代码而产生的错误,也称语法错误。实时错误是指在运行期间,一跳语句试图执行一条不可能执行的操作而产生的错误,也称运行时错误。逻辑错误是指程序的运行结果和程序员的设想有出入时产生的错误。
9.2 程序调试方法 VB本身不能改正错误,但它提供了一些调试工具辅助程序员查找,分析错误。有了调试工具,程序员就能够深入到应用程序内部,彻底地了解发生了什么,以及为什么会发生。
9.2.1 用编译器提示错误 VB集成环境提供了“自动语法检测”功能,可以在程序员编写程序时自动检测和提示语法错误。如果使用了该选项,那么程序员每书写完一行语句并键入回车符时,VB编译器就会解释该行语句。当发现错误时,就会加亮显示出现语法错误的语句并显示一个消息框来解释错误原因并提供帮助,以方便程序员更正错误。 在“工具”菜单上,单击“选项”子菜单,可以设置或消除“自动语法检测”选项。
P226 习题 二、程序设计题 1.程序改错。以前面学到的冒泡排序算法为例,开发以下程序,请上机练习排除其中的错误。
P226 习题 二、程序设计题 1.程序调试。 (1)运行程序,结果如下: 没有实现冒泡 排序。
P226 习题 二、程序设计题 1.程序调试。 (2)分析错误原因: For c = 1 To 20 For j = c + 1 To 20 If A(c) > A(j) Then ’若前者大于后者 T = A(j) ’T暂存小数 A(j) = A(c) ’后者暂存大数 A(j) = T ’此语句应改为A(c)=T End If Next Next
P226 习题 二、程序设计题 1.程序调试。 (3)修改后的程序:
P226 习题 二、程序设计题 1.程序调试。 (4)程序修改后运行结果:
9.2.2 使用调试工具来发现和改正错误 利用VB提供的调试工具,除了可以完成断点设置、中断表达式、监视表达式、单步执行、显示变量和属性值外,还能够在实现应用程序处于中断模式时进行编译、设置下一条执行语句,进行过程测试等功能。 “调试工具”菜单如下:
调试菜单各功能项的主要含义 1.逐语句:每按一次F8键,应用程序就执行一条语句,因此也称单步执行。是一种常见的调试方法。如果程序调用了另一个过程,逐语句也会执行该过程中的每一行。 2.逐过程:与逐语句执行过程相似,但如果程序调用了另一个过程,逐过程不会进入该过程。 3.跳出:执行当前过程的其它部分,并在调用该过程的下一 行语句处中断执行。
调试菜单各功能项的主要含义 4.运行到光标处:执行程序,当下一条语句为光标所在语句时,中断执行。 5.添加监视:添加对变量和表达式的跟踪,以便在程序运行时,随时观察变量和表达式的值。 6.编辑监视:在程序运行时,动态改变所要监视的变量或表达式。 7.快速监视:主要用于快速查看光标后面的变量的值。
调试菜单各功能项的主要含义 8.切除断点:用于设置或切除断点 9.清除所有断点:用于清除程序中设置的所有断点。 10.设置下一条语句:程序员可以按自己的思路改变程序的执行流程。 11.显示下一条语句:快速切换并切换到下一条执行的语句处,当代码量较大时,该功能很有用。
9.2.3 常用的调试技巧 如果程序的运行结果和预想的不一样,通常可在编辑器中浏览代码,查找并直接修改可能产生问题的代码。但多数情况下,即使是非常有经验的程序员也很难一眼就找处错误,此时常用的方法就是在程序运行的关键路径上设置一系列断点,并重新启动应用程序。
可供参考的调试技巧: 1.事先做好备份 避免在程序调试过程中,被意外地修改、覆盖或删除必要的代码部分。 2.分离受怀疑的程序 对于那些代码规模较大,窗口众多的程序而言,如果能将错误的范围定位于某个窗体或某段代码,则可以使用分离程序的调试方法。基本思路是找出错误的代码行(块)或窗体,选择这些代码并将其复制到一个新的工程中,最后运行新工程,看一看是否还会出现同样的错误。这样就可以尽可能地排除程序其它部分的干扰,提高调试效率。
可供参考的调试技巧: 3.缩小搜索范围 如果有可能的话,可删除工程中任何第三方控件和自定义控件,或者看来与问题无关的代码,逐步缩小搜索范围。或者采用相反的策略,先调试某一段代码或窗体,再像搭积木似的逐步扩大调试范围。 2.使用MsgBox语句 如果怀疑程序的错误是由于执行路径或者变量的值不正确等原因造成的,除了采用设置断点的方法进行调试以外,还可以借助于MsgBox语句。即在程序运行的关键点上插入一系列的语句,用来展示程序的运行路径和这样变量的值。
使用MsgBox语句的调试技巧示例 设计一个将小写金额转换为大写金额的简化转换程序,将输入的用数字表示的金额转换为有汉字表示的大写金额。 Private Sub form_click() '本程序将根据MyNumber的值返回大写数值 Dim Mstr(9) As String Dim MyNumber As String Dim Lstr As String Dim i, j As Integer Dim Convert As String
Mstr(0) = “零”:Mstr(1) = “壹”:Mstr(2) = “贰”Mstr(3) = “叁”:Mstr(4) = “肆”:Mstr(5) = “伍”Mstr(6) = “陆”:Mstr(7) = “柒”:Mstr(8) = "捌" Mstr(9) = "玖" MUnit = "元拾佰仟万拾佰仟亿拾佰仟" MyNumber = InputBox(“请输入一个数字”, _ "输入数字")
For i = 1 To Len(MyNumber) '从高位到低位逐位取输入数字 j = Val(Mid(MyNumber, i, 1)) '用MsgBox提示当前的数字 MsgBox "当前的数字是:" + Str(j) '取当前数字对应单位左边的字串 Lstr = Mid(MyNumber, i) '从高位到低位逐位转换成汉语大写字符 Convert=Convert+Mstr(j)+Mid(MUnit,Len(Lstr),1) '用MsgBox提示从高位到低位转换的结果 MsgBox "转换后的字符串是:" + Convert Next i End Sub
P226 习题 一、问答题 3. 简述常用的程序调试技巧。 答: 1)事先做好备份; 2)分离受怀疑的程序; 3)缩小搜索范围; 4)使用MsgBox语句。
P226 习题 一、问答题 4. 简要说明VB程序调试的主要方法和工具。 答:VB 程序调试的主要方法:用编译器提示错误;使用调试工具来发现和改正错误;采用常用的调试技巧,如事先做好备份,分离受怀疑的程序,缩小搜索范围,使用MsgBox语句等。 主要工具:“调试”菜单下的“逐语句”、“逐过程”、“跳出”、“运行到光标处”、“添加监视”、“快速监视”、“切换断点”等子菜单项。
9.3 错误捕获及处理方法 1.没有错误捕获及处理过程的程序执行效果 演示char10.2.1 正确情况下。程序不会出现任何错误,单如果指定的驱动器是软盘驱动器时。则只有驱动器内有磁盘且驱动器关闭时,该程序才能正确执行,否则产生“设备不可用”之类的错误使程序终止执行。
2. 加入错误捕获及处理过程的程序执行效果 为了防止上述情况的发生,就需要在该程序中加入错误捕获和处理程序,提高程序的可靠性。这样当出现任何异常时,程序会向用户提示,不再因此而异常退出。 演示char9.3.1
程序代码设计 Private Sub Form_Load() '设置控件的有效状态 Drive1.Enabled = True Dir1.Enabled = True File1.Enabled = True '设置过滤器 File1.Pattern = "*.exe" '设置控件的初始驱动器 Drive1.Drive = "c:\" End Sub
程序代码设计 Sub Dir1_Change() '改变目录 File1.Path = Dir1.Path End Sub
程序代码设计 Private Sub Drive1_Change() On Error GoTo CheckError ’改变驱动器 Dir1.Path = Drive1.Drive Exit Sub CheckError: 错误代码处理 FileExixts = False Mystr = "发生了以下错误:" + Err.Description Mystr = Mystr + vbCr + "错误号是:" + Str(Err.Number) Mystr = Mystr + vbCr + "你输入的文件路径:" + Dir1.Path MsgBox Mystr, vbQuestion, "错误捕获与处理演示" End Sub
程序代码设计 Private Sub File1_Click() If File1.FileName <> "" Then FileExists = True MsgBox ("文件名为“" + File1.FileName + "”的路径为:" _ + File1.Path + "\" + File1.FileName) Else FileExists = False MsgBox ("找不到文件名为“" + File1.FileName + "”的文件!") End If End Sub
9.3.2 设计错误处理程序的三个步骤 1.捕获错误,并强制程序跳转 即在发生错误时,捕获错误将告知应用程序转向哪段代码进行错误处理。VB语句通常可采用On Error GoTo 语句启用错误捕获机制。如果出现运行时错误,即可借助On Error GoTo 语句,强制程序跳转到指定的标记处。需要注意的是, On Error GoTo 语句只能在一个过程内部跳转,并且在一个过程中一次只能启用一个错误捕获。如果要使错误捕获失效,因可使用On Error GoTo 0 之类的语句。
9.3.2 设计错误处理程序的三个步骤 2.编写错误处理程序 编写错误处理程序的第一步是添加一个行标识符,比如“CheckError”,以标志错误处理程序的开始。行标识符的名称最好具有良好的可读性,并且后面必须紧跟一个冒号。常规错误处理程序通常放在过程的结束处,后面紧跟Exit或Exit Function的行标识符。这样在没有错误发生时,过程就不会执行错误处理程序了。
9.3.2 设计错误处理程序的三个步骤 通常的格式为: Sub 程序名( ) On Error GoTo 行标识符 [正常的程序代码] Exit Sub ’正常退出程序 行标识符: 错误处理程序 End Sub
9.3.2 设计错误处理程序的三个步骤 3.退出错误处理程序 通常情况下,只有当错误处理程序位于过程中间位置时,才需要用到专门的错误处理程序退出语句。一般可以用Resume或Resume Next语句退出错误处理程序。Resume语句会继续执行引发错误的那句代码,而Resume Next语句则会跳过该语句,执行引发错误代码的下一句语句。
P226 习题 一、问答题 2.请简要设计错误处理程序的三个步骤。 答: 1)捕获错误,并强制程序跳转 2)编写错误处理程序 3)退出错误处理程序
9.3.3 Err对象 Err对象是个运行期对象,它包含了有关最新错误的信息。当运行中遇到了一个错误时,或者当用户使用Err对象的Raise方法故意引发一个错误时,它形成了Error对象的属性。当遇到On Error语句时,或使用Exit Sub,Exit Function语句退出一个过程后,Err对象的属性值将被清除。若要强制清除Err对象的属性可以调用它的Clear方法。
9.3.4 On Error语句 On Error命令有三种形式: 1.On Error Resume Next 语句:当发生错误时,VB程序将忽略引发错误的语句,并继续执行下一条语句。 2.On Error GoTo 行标识符语句:当发生错误时,使用该语句强制改变程序的执行方向。 3.On Error GoTo 0 语句:用于关闭错误捕获机制。
P226 习题 一、问答题 6.请说明 On Error GoTo 与On Error Resume Next 的区别。 答:On Error GoTo 行标识符语句:当发生错误时,使用该语句强制改变程序的执行方向。而On Error Resume Next 语句:当发生错误时,VB程序将忽略引发错误的语句,并继续执行下一条语句。
P226 习题 二、程序设计题 2.错误处理。按下图设计一除法程序,请使用On Error GoTo 语句对除法程序进行处理,当出现除数为0或其他异常情况时,使用MsgBox提示错误信息。
P226 习题 二、程序设计题 程序代码:
9.3.5 如何避免错误 尽管VB提供了多种错误捕获及处理方法,但是调试毕竟是件费时费事是工作,因此最好能在程序中尽量避免错误。避免应用程序中产生错误的若干方法: 1. 事先精心设计应用程序,描述清楚相关事件以及代码响应每一事件的方法,为每一事件过程和每个普通过程都指定一个特点的、明确的目标。 2. 多加注释。如果用注释说明每个过程的目的,在以后分析代码时,能更深入地理解这些代码。 3. 对过程中用到的每个变量或对象都应该在过程开始部分加以定义。 4.在应用程序中对变量和对象提出一种前后一致的命名方案。