程序调试与错误处理_第1页
程序调试与错误处理_第2页
程序调试与错误处理_第3页
程序调试与错误处理_第4页
程序调试与错误处理_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

1、与与 程序调试的主要任务:查找程序的错误和排除错误程序调试的主要任务:查找程序的错误和排除错误 本章主要内容本章主要内容 VB程序中的错误类型程序中的错误类型 程序工作模式程序工作模式 程序调试程序调试 错误处理错误处理第第9 9章章 程序调试与错误处理程序调试与错误处理 三类错误类型:三类错误类型:编译错误,逻辑错误和运行错误编译错误,逻辑错误和运行错误 1. 编译错误编译错误 编译错误是指在程序编译过程中出现的错误。通常是编译错误是指在程序编译过程中出现的错误。通常是由于不正确书写代码而产生的。由于不正确书写代码而产生的。 例如:关键字写错,遗漏标点符号,括号不匹配等。例如:关键字写错,遗

2、漏标点符号,括号不匹配等。 较为容易排除。较为容易排除。VB提供了自动语法检查功能,能指出提供了自动语法检查功能,能指出并显示这些错误,帮助用户纠正语法错误。并显示这些错误,帮助用户纠正语法错误。 例子:例子: Foor t = 1 To 1009.1 VB9.1 VB程序中的错误类型程序中的错误类型 2. 运行错误运行错误 运行时的错误是指应用程序在运行期间执行了非法操作运行时的错误是指应用程序在运行期间执行了非法操作所发生的错误。所发生的错误。 例如,除法运算中除数为零,访问文件时文件夹或文例如,除法运算中除数为零,访问文件时文件夹或文件找不到等。这种错误只有在程序运行时才能被发现。件找不

3、到等。这种错误只有在程序运行时才能被发现。 举例举例(“下标越界下标越界”): 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. 逻辑错误逻辑错误 逻辑错误使程序运行时得不到预期的结果逻辑错误使程序运行时得不到预期的结果。这种程序没有。这种程序没有语法错误,也能运行,但却得不到正确的结果。语法错误,也能运行,但却得不到正确的结果。 例如,在一个算术表达式中,把乘号例如,在一个算术表达式中,把乘号“*”写成了加号写成了加号“+”,条件语句的条件写错

4、,循环次数计算错误等条件语句的条件写错,循环次数计算错误等 例如,要求例如,要求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设计模式设计模式 在设计模式下,可以建立应用程序的用户界面,设

5、置控在设计模式下,可以建立应用程序的用户界面,设置控件的属性,编写程序代码等件的属性,编写程序代码等 2. 运行模式运行模式 在运行模式下,可以测试程序的运行结果,可以与应用在运行模式下,可以测试程序的运行结果,可以与应用程序对话,还可以程序对话,还可以 查看程序代码,但不能修改程序查看程序代码,但不能修改程序 3. 中断模式中断模式 在中断模式下,可以利用各种调试手段检查或更改某些在中断模式下,可以利用各种调试手段检查或更改某些变量或表达式的值,或者在断点附近单步执行程序,以便发变量或表达式的值,或者在断点附近单步执行程序,以便发现错误或改正错误现错误或改正错误 9.2 9.2 程序工作模式

6、程序工作模式 进入中断模式的方法:进入中断模式的方法: (1)在代码中插入在代码中插入Stop语句;语句; (2)在代码窗口中设置断点在代码窗口中设置断点(用菜单命令用菜单命令); (3)在代码窗口中设置断点在代码窗口中设置断点(鼠标操作鼠标操作); (4)在程序运行时强制在程序运行时强制“中断中断”; (5)当程序运行出现错误。当程序运行出现错误。 当检查调试通过后,需要清除断点当检查调试通过后,需要清除断点 程序调试一般包括程序调试一般包括静态检查静态检查和和动态检查动态检查 9.3.1 静态检查与动态检查静态检查与动态检查 静态检查静态检查程序的基本方法是程序的基本方法是逐行逐句地读程序

7、逐行逐句地读程序,弄清楚每,弄清楚每条语句的作用,预见每条语句和模块的执行结果,判断是否与条语句的作用,预见每条语句和模块的执行结果,判断是否与预期结果相一致,这就是静态检查,也称人工检查。预期结果相一致,这就是静态检查,也称人工检查。 静态检查无误后,就可以进行更有效的静态检查无误后,就可以进行更有效的动态检查动态检查。通过上通过上机调试来发现错误机调试来发现错误称为动态检查。称为动态检查。 动态检查的基本方法是输入一组典型的数据来运行程序。动态检查的基本方法是输入一组典型的数据来运行程序。程序对这些数据处理结果应是已知的,通过运行后实际结果和程序对这些数据处理结果应是已知的,通过运行后实际

8、结果和预想结果相比较,可以判断程序的正确性预想结果相比较,可以判断程序的正确性 9.39.3 程序调试程序调试 例如,为了检验求解一元二次方程例如,为了检验求解一元二次方程ax2+bx+c=0的程序的程序(见第见第四章例四章例4.14)是否正确,我们可以输入以下是否正确,我们可以输入以下四组四组a,b,c的数值:的数值: 第一组:第一组:0,1,1 预期结果:显示预期结果:显示“不是二次方程不是二次方程”第二组:第二组:1,-2,1 预期结果:预期结果:x1=1,x2=1(两个相等实根两个相等实根)第三组:第三组:1,1,-2 预期结果:预期结果:x1=1,x2=-2(两个不等实根两个不等实根

9、)第四组:第四组:1,2,2 预期结果:预期结果:x1=-1+i, x2=-1-i(两个共轭复根两个共轭复根) 动态检查中,通常在一些敏感点处设置断点,检查一些变动态检查中,通常在一些敏感点处设置断点,检查一些变量或表达式的值。量或表达式的值。 使用使用“调试调试”菜单或菜单或“调试调试”工具栏工具栏 1切换断点切换断点 “切换断点切换断点”按钮用来设置断点按钮用来设置断点 2. 逐语句逐语句 VB允许逐条语句执行程序,每执行一条语句后就返回中断允许逐条语句执行程序,每执行一条语句后就返回中断模式。模式。 如果执行的是过程调用的代码如果执行的是过程调用的代码(如如Call),“逐语句逐语句”操

10、作也操作也会跟踪到被调过程中继续一条语句一条语句的执行会跟踪到被调过程中继续一条语句一条语句的执行 3. 逐过程逐过程 逐过程执行是以整个函数或过程为一个整体,一次执行。逐过程执行是以整个函数或过程为一个整体,一次执行。逐过程与逐语句一样,能够一条语句一条语句地执行代码。把逐过程与逐语句一样,能够一条语句一条语句地执行代码。把被调用的函数或过程当作一个语句来看待被调用的函数或过程当作一个语句来看待切换断点切换断点 逐过程逐过程 本地窗口本地窗口 监视窗口监视窗口逐语句逐语句 跳出跳出 立即窗口立即窗口 快速监视快速监视9.3.2 9.3.2 使用使用VBVB调试工具调试工具 4. 跳出跳出 单

11、击单击“调试调试”工具栏上的工具栏上的“跳出跳出”按钮,则按钮,则VB将连续将连续执行完该过程的其余部分,返回调用过程的下一条语句并回执行完该过程的其余部分,返回调用过程的下一条语句并回复中断模式复中断模式 5. 本地窗口本地窗口 显示当前过程中所有变量和活动窗体的所有属性值显示当前过程中所有变量和活动窗体的所有属性值 Me代表当前窗体;单击代表当前窗体;单击“+”号或号或“-”号号 6. 立即窗口立即窗口 可以检查某个属性或者变量的值,也可以对表达式求值,可以检查某个属性或者变量的值,也可以对表达式求值,或为变量或属性赋值等或为变量或属性赋值等 7. 监视窗口监视窗口 对用户定义的表达式进行

12、监视对用户定义的表达式进行监视 例例9.1 运行以下的窗体装载事件过程运行以下的窗体装载事件过程: Private Sub Form_Load() Dim a% a% = 5: a = 5.4 c = 1 / (a - a%) End Sub 运行时出错,消息框提示发生运行时出错,消息框提示发生“除数为零除数为零”的错误。的错误。 单击消息框中的单击消息框中的“调试调试”按钮,即可进入中断模式,按钮,即可进入中断模式,VB在代在代码窗口中用箭头指示发生错误的语句码窗口中用箭头指示发生错误的语句“C=1/(a-a%)”。 在立即窗口中键入以下命令来检查变量的值:在立即窗口中键入以下命令来检查变量

13、的值: ? a, a% ?是是Print的简写的简写 出错前变量出错前变量a的当前值为整数的当前值为整数5,而不是,而不是5.4,故发生了,故发生了“除数除数为零为零”的错误的错误 编写的程序代码如下:编写的程序代码如下: 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例例

14、9.2 计算计算t = 0.1 + 0.2 + 0.3 + + 0.9 + 1 利用调试工具来查找出错原因,操作步骤如下:利用调试工具来查找出错原因,操作步骤如下: (1)在代码窗口中设置断点在代码窗口中设置断点。为了了解循环过程中变量。为了了解循环过程中变量i和和t的变化情况,可在语句的变化情况,可在语句t = t + i 处设置断点。处设置断点。 (2)重新运行程序重新运行程序。程序在断点处中断运行,进入中断模式。程序在断点处中断运行,进入中断模式 (3)单击单击“调试调试”工具栏上的工具栏上的“本地窗口本地窗口”按钮,利按钮,利用本地窗口来用本地窗口来监视过程中各量及属性值的变化情况监视

15、过程中各量及属性值的变化情况 (4)单击单击“调试调试”工具栏上的工具栏上的“逐语句逐语句”按钮,让程序按钮,让程序单单步执行步执行。 “本地窗口本地窗口”会显示出程序中所用变量的当前值。会显示出程序中所用变量的当前值。 (5)连续单击连续单击“逐语句逐语句”按钮,使程序在按钮,使程序在For语句语句循环执循环执行行9次,此时本地窗口显示的变量值如图次,此时本地窗口显示的变量值如图9.7所示所示 (6)再次单击再次单击“逐语句逐语句”按钮。程序不再继续循环,而是按钮。程序不再继续循环,而是退出循环,去执行退出循环,去执行Next i下一个的下一个的Print语句。语句。 可以发现可以发现上述循

16、环语句只是循环上述循环语句只是循环9次次。本来应该循环。本来应该循环10次,但由于小数点在机器内存储和处理会发生微小误差,当次,但由于小数点在机器内存储和处理会发生微小误差,当执行到第执行到第9次循环时,循环变量次循环时,循环变量i的值为的值为0.9000001,再加上步,再加上步长值长值0.1时,已经超过时,已经超过1,往下就不再执行循环体了。所以实,往下就不再执行循环体了。所以实际上才循环际上才循环9次,即只计算次,即只计算0.1 + 0.2 + 0.3 + + 0.9(=4.5) 当步长值为小数时,为了防止丢失循环次数,可将当步长值为小数时,为了防止丢失循环次数,可将终值终值适当增加适当

17、增加,一般是加上步长值的一半,例如:,一般是加上步长值的一半,例如: For i=0.1 To 1.05 Step 0.1 调试程序往往比写程序更难调试程序往往比写程序更难 由于应用环境等的改变,有时程序还会出现错误。例如文由于应用环境等的改变,有时程序还会出现错误。例如文件未找到等。这类件未找到等。这类“运行时错误运行时错误”并非致命的错误。并非致命的错误。 对于这些可预见的错误,可以利用对于这些可预见的错误,可以利用VB的错误处理程序捕的错误处理程序捕获它,对其进行适当的处理,并使程序继续执行。这样就能够获它,对其进行适当的处理,并使程序继续执行。这样就能够使开发的软件具有更强的适应性。使

18、开发的软件具有更强的适应性。 9.4.1 错误处理的步骤错误处理的步骤 (1)利用利用Err对象记录错误的类型、出错原因等。对象记录错误的类型、出错原因等。 (2)强制转移到用户自编的强制转移到用户自编的“错误处理程序段错误处理程序段”的入口。的入口。 (3)在在“错误处理程序段错误处理程序段”内,根据具体错误进行处理,如内,根据具体错误进行处理,如果问题有解决方法,则在处理后返回原程序某处继续执行,否果问题有解决方法,则在处理后返回原程序某处继续执行,否则,停止程序执行则,停止程序执行 9.4 9.4 错误处理错误处理 Err对象是全局性的固有对象,用来保存最新的运行时对象是全局性的固有对象

19、,用来保存最新的运行时错误信息,其属性由错误生成者设置错误信息,其属性由错误生成者设置 1. 主要属性主要属性 (1)Number属性:为数值类型,范围为属性:为数值类型,范围为065535,保存错,保存错误号。误号。 (2)Source属性:为字符串,指明错误产生的对象或应用属性:为字符串,指明错误产生的对象或应用程序的名称。程序的名称。 (3)Description属性:为字符串,用于记录简短的错误信属性:为字符串,用于记录简短的错误信息描述。息描述。 2. 常用方法常用方法 (1)Clear方法:用于清除方法:用于清除Err对象的当前属性值。对象的当前属性值。 (2)Raise方法:产生

20、错误,用于调试错误处理程序段。方法:产生错误,用于调试错误处理程序段。 例如,执行语句例如,执行语句Err.Raise 55将产生将产生55号运行时错误,即号运行时错误,即“文件已打开文件已打开”错误错误 9.4.2 9.4.2 ErrErr对象对象 使用使用On Error语句可以捕获错误,其语法格式如下:语句可以捕获错误,其语法格式如下: On Error 标号标号 通常,该语句放置在过程的开始位置。在程序运行过程中,通常,该语句放置在过程的开始位置。在程序运行过程中,当该语句后面的代码出错时,则程序就会自动跳转到标号所指当该语句后面的代码出错时,则程序就会自动跳转到标号所指定的程序行去运

21、行定的程序行去运行 标号所指示的程序行通常为错误处理程序段的开始行标号所指示的程序行通常为错误处理程序段的开始行 一个使用错误处理的示例:一个使用错误处理的示例: On Error GoTo ErrLine 以后出错时转移至以后出错时转移至ErrLine . . . ErrLine: 标号标号 . . . Resume 返回语句返回语句9.4.3 9.4.3 捕获错误语句捕获错误语句(On Error)(On Error) 当指定的错误处理完成后,应该控制程序返回到合适的位当指定的错误处理完成后,应该控制程序返回到合适的位置继续执行。置继续执行。 返回语句返回语句Resume有三种用法:有三种

22、用法: (1)Resume 0:程序返回到出错语句处继续执行。程序返回到出错语句处继续执行。 (2)Resume Next:程序返回到出错语句的下一语句。程序返回到出错语句的下一语句。 (3)Resume 标号:标号:程序返回到标号处继续执行。程序返回到标号处继续执行。9.4.4 9.4.4 退出错误处理语句退出错误处理语句(Resume)(Resume) 输入某个数,求该数的平方根。当用户输入负数时,使输入某个数,求该数的平方根。当用户输入负数时,使用用On Error.Resume进行处理进行处理 Private Sub Form_Load() Dim x As Single, y As Single, i As String On Error Go

温馨提示

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

评论

0/150

提交评论