程序调试和错误处理.ppt_第1页
程序调试和错误处理.ppt_第2页
程序调试和错误处理.ppt_第3页
程序调试和错误处理.ppt_第4页
程序调试和错误处理.ppt_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

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

文档简介

2019/7/20,清华大学出版社,1,第10章 程序调试和错误处理,10.1 VB程序的错误类型 10.2 VB程序的工作模式 10.3 程序调试 10.4 错误捕获及处理,2019/7/20,清华大学出版社,2,【目的要求】 1.理解程序的错误类型; 2.掌握VB提供的常用调试工具的使用3. 3.掌握错误的捕获与处理方法 ; 【重点】 错误的捕获与处理方法 ;,2019/7/20,清华大学出版社,3,10.1 VB程序的错误类型,VB应用程序的错误一般可分为3类,即编译错误(语法错误)、运行错误和逻辑错误。 1.编译错误:指程序在编译时出现的错误(语法错误)。 2.运行错误:运行错误是指程序本身没有编译(语法)错误,这种错误在编译时很难发现,只是在运行时才能暴露出来。例如下面求某个数阶乘的函数:,Private Sub Command1_Click() Print fact(14) End Sub,程序本身没有任何语法错误,但在程序运行过程中,语句Print fact(14)(计算14的阶乘)的返回的值超出整型数值的范围,产生数据溢出导致程序出错。,Private Function fact(ByVal n As Integer) As Integer Dim s As Integer , i As Integer s = 1 For i = 1 To n s = s * i Next i fact = s End Function,2019/7/20,清华大学出版社,4,3.逻辑错误,逻辑错误是指从语法上看程序代码是有效的,并且也可以运行,但得不到应有(正确)的结果。与上述两种错误不同,逻辑错误不报告错误信息。,【例10.1】编程计算0.1+0.2+0.3+0.9的值。 Private Sub Command1_Click() Dim i As Single,s As Single For i = 0.1 To 0.9 Step 0.1 s = s + i Next i Print s End Sub,正确的结果应该是4.5,但按照上面的代码,结果却是3.6。,2019/7/20,清华大学出版社,5,10.2 VB程序的工作模式 VB程序有三种工作模式:设计模式(Design Time)、运行模式(Run Time)和中断模式(Break Model)。 1.设计模式 2.运行模式 3.中断模式 在中断模式下,暂停应用程序的执行,此时可以检查程序代码,并可以进行修改,也可以检查数据是否正确,修改完程序后,可继续执行程序。VB所有调试手段均可以在中断模式下应用。 可以用以下四种方式进入中断模式: l 在“运行”模式下,执行“运行”菜单中的“中断”命令; l 在程序中设置断点,程序运行到断点处时自动进入中断模式; l 在程序中加入“STOP”语句,程序运行到该语句处时自动进入中断模式; l 在程序运行过程中,如果出现错误,则自动进入中断模式;,从语法和算法设计思路来看,都没有错误,但始终得不到正确的结果。这类错误是所有错误中最难诊断、最难解决的错误,只有通过调试工具的帮助,对程序进行逻辑分析、代码调试及分析、比较运行结果等综合手段才能最终加以解决。,10.3 程序调试 10.3.1 Visual Basic程序调试工具 为了使用调试工具,应首先进入中断模式,此时程序中的变量和控件的属性值都被保留下来,为用户分析应用程序的当前状态,解决程序的各种错误提供了有力的保障。图10-6所显示的【调试】工具栏为用户提供了许多功能强大的调试工具。,2019/7/20,清华大学出版社,6,图10-6,运用这些调试工具可以对产生逻辑错误的程序进行调试,对程序的调试大致分为三个步骤: 第一步是设置断点; 第二步是跟踪程序运行; 第三步是使用调试窗口。,2019/7/20,清华大学出版社,7,1.设置断点,就是在程序代码中设置一些断点,当程序执行到该点时就会自动暂停下来,以方便用户对程序进行调试。,(1)在程序代码区人工设定一个断点。 (2)运行程序,当执行到了设置断点的代码行时,程序终止进入中断状态,将鼠标移动到某个变量上面,可以看到设置断点代码行中变量的值。,例:验证【例10.1】的运行结果错在何处?,2019/7/20,清华大学出版社,8,2.跟踪程序运行,逐语句执行 在调试工具栏上有一个单步执行程序的按钮。单击该按钮可以单步执行程序。也可以用热键F8来实现单步执行程序,或者在【调试】菜单上选取【逐语句】选项。 逐过程执行 “逐过程执行” 是把被调用的过程视为一个基本单位来执行,然后转回到当前过程的下一语句。操作方法:单击“调试”工具栏上的“逐过程”按钮。也可以用组合键Shift+F8或“调试”菜单上的“逐过程”选项。 跳出 当使用逐语句方式进入到一个过程中,如果确认该过程的语句绝对没有问题,可以单击【调试】工具栏的【跳出】按钮或按下快捷键Ctrl+Shift+F8,从当前过程中跳出,去执行过程调用者的下一条语句。,2019/7/20,清华大学出版社,9,3.调试窗口,在上面的方法中我们只通过设置断点和跟踪程序运行这两步,就已经检查出程序的错误了。对于较复杂的程序的调试,需要使用VB提供的调试窗口来完成。调试窗口主要包括立即窗口、本地窗口、监视窗口等。,运行到光标处 在对程序进行跟踪时,想略过不感兴趣的部分代码(如次数很多循环语句),这时可以把光标设置在需要停止运行的代码上,然后按下快捷键Ctrl+F8或选择【调试】菜单的【运行到光标处】选项。,例:使用调试窗口来完成调试【例题10.1】的运行结果错在何处?,2019/7/20,清华大学出版社,10,本地窗口,只显示当前过程中变量的值(即使是全局变量,也不会显示)。 打开本地窗口的步骤: 1)设置断点后,启动程序; 2)程序被中断后,单击【视图】菜单中的【本地窗口】选项或单击【调试】工具栏的【本地窗口】按钮。,监视窗口 使用【监视】窗口有两种用法: 一是可用来显示某些表达式或变量的值,以确定这写表达式或变量的结果是否正确; 二是可以设置当某个表达式返回True时,强迫程序中断。,2019/7/20,清华大学出版社,11,用法一: 例:通过【监视】窗口对【例10.1】进行调试,检测变量s和i的值的变化情况。 用法二: 这种用法是在当表达式的值满足某个条件时,可以使应用程序自动进入到中断模式的一种调试手段。这种方法不需要在代码区设置断点。 例: 在【例10.1】中,为了检测当变量s的值大于3时,循环变量i的值;可以通过对【监视窗口】的相关设置来完成。,思考: 判断12100的累加结果在i?时累加值超过4000,使用【监视窗口】如何完成?,2019/7/20,清华大学出版社,12,立即窗口,使用立即窗口可以检查某个属性或变量的值,还可以对表达式求值、为变量或属性赋值。 立即窗口的使用有下面三种: (1)在设计模式下,直接在立即窗口中对变量赋值,或使用Print方法输出变量的值。 (2)在应用程序中,使用Debug.Print 语句把信息输入到立即窗口。 例如,将【例10.1】的程序代码中的输出语句改为“Debug.Print s”,运行结果会在立即窗口中输出。 (3)在中断模式下,可以在立即窗口中使用Print方法输出当前变量或控件的值,也可以对当前变量或控件的属性赋值。 注意:在立即窗口中,不接受数据声明,如:Dim x as Integer。,2019/7/20,清华大学出版社,13,10.3.2 调试示例,VB提供的各种调试工具,不仅可以帮助用户检查程序的逻辑错误,而且还可以帮助用户理解程序的执行过程,如过程(函数)的参数传递方式。,【例10.2】设计一窗体,如左图所示。在窗体上放置文本框Text1、Text2,分别用于输入一个整数闭区间的上下限,当单击【计算】按钮时,Text3中显示该闭区间上所有整型数据的累加和。其中累加的计算使用过程sum来完成。,2019/7/20,清华大学出版社,14,双击【计算】按钮,编写程序代码: Private Sub Command1_Click() Dim x As Integer,y As Integer,z As Integer x = Val(Text1.Text) y = Val(Text2.Text) Call sum(x, y, z) 调用过程sum ,通过实参数z返回结果 Text3.Text = Str(z) End Sub,运行程序,分别在文本框Text1和Text2内输入1和5;单击【计算】,我们注意到在Text3内显示的结果为0。程序错在何处?下面使用调试工具调试该程序,找出错误所在。,定义sum过程:形参数a,b表示闭区间的上下限,参数c用于向主程序传递运算的最终结果。三个参数的传递方式都是按数值传递。 Sub sum (ByVal a , ByVal b , ByVal c As Integer) Dim i As Integer Dim s As Integer For i = a To b s = s + i Next c = s End Sub,2019/7/20,清华大学出版社,15,l 调试步骤: (1)将断点设置在主程序的“Call sum(x, y, z)”语句处。然后运行程序,在Text1和Text2中分别输入1和5。 (2)运行程序,单击【计算】按钮,当程序中断后,打开【监视】窗口,向【监视】窗口添加监视表达式,x、y、z、a、b、c;注意此时各监测表达式的值。因为当前程序的控制权在主程序,所以过程sum中的参数a、b、c还没有意义,在监视窗口中显示为“”。,2019/7/20,清华大学出版社,16,(3)按F8键以逐语句方式运行程序,此时,程序转入到sum过程执行,注意各监测表达式的值的变化情况,如下图所示。,(4)当以逐语句方式运行程序到sum过程的“End Sub”语句处时,我们发现变量c的值变为15,而与之对应的实参数z变量的值并没有变化。,2019/7/20,清华大学出版社,17,(5)按F8键继续以逐语句方式运行程序,此时过程sum执行结束,返回到主程序Command1_Click(),过程sum中的变量重新显示为“” 。说明这些变量此时没有意义(这也说明:过程内部的变量的作用域只限于当前过程)。同时我们注意到,作为与形参数c对应的实参数z的数值仍然为0。所以,我们试图通过将形参数c的运算结果传递给z,并没有成功。,通过调试,我们得出结论:要使用形参数返回过程的运算结果,不能使用按数值传递方式(ByVal),要使用按地址传递方式(ByRef)。对于本例,我们可以将sum过程的首部改为:Sub sum (ByVal a As Integer, ByVal b As Integer, ByRef c As Integer)。按上面的方法重新运行,观察监视窗口的变化,2019/7/20,清华大学出版社,18,10.4 错误捕获及处理,10.4.1 错误处理步骤,在VB中要增加应用程序的处理错误的能力,需要做以下两步工作: (1)设置错误陷阱 (2)编写错误处理程序 VB提供了0n Error GoTo语句设置错误陷阱,捕捉错误。,10.4.2 ERR对象,在on Error语句捕捉到错误后,Err对象的Number属性返回错误的代号,通过错误代号即可知道引发错误的原因。,2019/7/20,清华大学出版社,19,Err对象的属性有: Number:错误号 Description:错误描述 HelpFile:该错误相应的帮助文件 HelpContex:该错误帮助说明的主题号 Source:错误来源 VB提供的Error函数用于返回错误信息,其语法如下: Error(错误号),例如在VB的立即窗口中键入如下代码: Print Error (6) 将显示“溢出”的错误信息。 要查找运行时的错误号,可以创建自己的错误,之后用代码显示Err.Number的值。,2019/7/20,清华大学出版社,20,10.4.3 捕获错误语句,错误处理程序指定的必须在同一过程中,On Error语句的语法格式有两种形式: 1. 用法一 On Error GoTo 标号 可能出错的语句 Exit Function(Sub) 标号: 错误处理,该用法是在对错误不需要特别处理,只是显示一下提示信息以告诉用户出错的原因时使用。,2019/7/20,清华大学出版社,21,【例10.3】编写程序,当除数为0时显示提示信息。,Private Sub Command1_Click() Dim a As Single, b As Single, c As Single a = Val(InputBox(“请输入被除数“, “除法“) b = Val(InputBox(“请输入除数“, “除法“) On Error GoTo Error c = a / b Print c Exit Sub 在没有发生错误时,通过该语句正常退出 Error: 在发生错误时,程序跳转到此标号处,开始执行 MsgBox Err.Description End Sub,2019/7/20,清华大学出版社,22,2.用法二,On Error GoTo 标号 可能出错的语句 Exit Function(Sub) 标号: 错误处理 Resume 语句标号|行号| Next,Resume语句有3种形式: (1)Resume:返回到出错语句处重新执行。 (2)Resume 语句标号|行号:返回到标号指定的行继续执行。若标号为0,则表示终止程序的执行。 (3)Resume Next:跳过出错语句,忽略错误,转到出错语句的下一条语句继续执行。,2019/7/20,清华大学出版社,23,语句应用:,例10.4】编写错误处理程序,用于处理软驱中无软盘时的错误。 Private Sub Command1_Click() Dim result As Integer On Error GoTo error Open “A:text.txt“ For Output As #1 Close #1 Exit Sub error: If Err.Number = 71 Then result = MsgBox(“请在A驱动器中插入软盘,准备好后按重试“, vbRetryCancel, “磁盘未准备好“) If result = 4 Then Resume 如果选择重试按钮,则重新打开文件,否则结束程序运行 End If End Sub,2019/7/20,清华大学出版社,24,语句应用:,【例10.5】对例10.3进行改造,编写错误处理程序,处理当除数为0时,提示用户重新输入除数。 Private Sub Command1_Click() Dim a As Single, b As Single,c As Single On Error GoTo Error a = Val(InputBox(“请输入被除数“, “除法“) Erroroccured: b = Val(InputBox(“请输入除数“, “除法“) c = a / b Print c Exit Sub 在没有发生错误时,通过该语句正常退出 Error: MsgBox “除数为零,请重新输入除数!“ Resume Erroroccured 跳转到Erroroccured标号(错误)语句处继续执行 End Sub,2019/7/20,清华大学出版社,25,语句:,【例10.6】使用Resume Next语句对例10.3中除数为0的情况进行处理。 Private Sub Command1_Click() Dim a As Single, b As Single ,c As Single On Error GoTo error a = Val(InputBox(“请输入被除数“, “除法“) b = Val(InputBox(“请输入除数“, “除法“) c = a / b Print c Exit Sub 在没有发生错误时,通过该语句正常退出 error: MsgBox “除数为零,输入错误!“ Resume Next 跳转到错误语句之后继续执行;即忽略错误,继续执行下一语句 End Sub,2019/7/20,清华大学出版社,26,如果不想在错误发生时进行任何错误处理(包括错误提示),可以在代码的开始部分使用On Error Resume Next 语句,该语句将忽略所有出现的错误,使程序一直执行到结束。,例10.6代

温馨提示

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

评论

0/150

提交评论