欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    【教学课件】第11章程序调试和出错处理.ppt

    • 资源ID:5657750       资源大小:274.50KB        全文页数:50页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    【教学课件】第11章程序调试和出错处理.ppt

    第11章 程序调试和出错处理,11.1 错误类型 11.2 调试和排错 11.3 出错处理 习题十一,11.1 错 误 类 型,1语法错误 当编写代码时,Visual Basic会对程序进行语法检查,当发现程序中存在打字错误、遗漏关键字或标点符号使用不当等语法错误时,Visual Basic在Form窗口中弹出一个子窗口,提示出错信息,出错的那一行变成红色,出错部分被高亮度显示,这时,用户必须单击“确定”按钮,关闭出错提示窗,然后对出错行进行修改。,2编译错误 编译错误指Visual Basic在编译应用程序时,由于用户未定义变量、遗漏关键字等原因产生的不正确的代码而引起的错误。这时,Visual Basic也弹出一个子窗口,提示出错信息,出错的那一行被高亮度显示,同时Visual Basic停止编译。这时,用户必须单击“确定”按钮,关闭出错提示窗,然后对出错行进行修改。,3运行错误 运行错误指Visual Basic在运行代码时发生的错误,这类错误往往是指令代码执行了一非法操作引起的。例如,除法时分母为零。有时,即使调用Visual Basic或Windows系统提供的标准系统函数或过程,也会发生错误。例如,当调用Visual Basic的Dir$()函数判断一个文件是否存在时,若被操作的驱动器未准备好或磁盘读写有错,就会发生错误。运行错误也将弹出一个子窗口,提示出错信息。窗口内第一行显示运行错误代号,第二行显示出错说明。在窗口的下方给出4个按钮,分别是“继续”、“结束”、“调试”和“帮助”,这时,可选择一个按钮决定如何处理错误。,(1)选择“帮助”按钮,Visual Basic将提供这一错误的帮助信息,包括错误说明、错误代号和引起该错误的可能原因,用户可参考提示排除错误。(2)选择“调试”按钮,进入调试窗,光标停留在引起出错的那一句上,此时允许修改代码。(3)选择“结束”按钮,结束本程序的运行。,4逻辑错误 程序运行后,得不到所期望的结果,这说明程序存在逻辑错误。这类错误往往是程序存在逻辑上的缺陷所引起的。例如,使用了不正确的变量类型或指令的次序不对。又如,循环中起终值不正确。逻辑错误也可以产生运行错误。通常,逻辑错误不会产生错误提示信息,故错误较难排除,需要程序员仔细地阅读分析程序。,11.2 调 试 和 排 错,11.2.1 调试窗口 在逐行运行应用程序的语句时,可用调试窗口监视表达式和变量的值。有三个调试窗口,它们是“立即”窗口、“监视”窗口和“本地”窗口。可单击视图菜单中的对应命令打开这些窗口。(1)“立即”窗口显示代码中正在调试的语句所产生的信息,或直接往窗口中键入的命令所请求的信息。例如,使用Print语句打印表达式的值,也可以在程序代码中利用Debug.Print方法把输出送到“立即”窗口。,(2)“本地”窗口显示当前过程中所有变量的值。当程序的执行从一个过程切换到另一个过程时,“本地”窗口的内容会发生改变,它只反映当前过程中可用的变量。(3)“监视”窗口显示当前的监视表达式,在代码运行过程中可决定是否监控这些表达式的值。中断表达式是一个监视表达式,当定义的某个条件为真时,它将使Visual Basic进入中断模式。在“监视”窗口中,“上下文”列指出过程、模块,每个监视表达式都在这些过程或模块中进行计算。只有当前语句在指定的上下文中时,“监视”窗口才能显示监视表达式的值。否则,“值”列只显示一条消息,指出语句不在上下文中,“类型”列指明表达式类型,监视窗内列的宽度可用鼠标拖曳列之间的分界线来调整。,Visual Basic自动对监视表达式进行监视。当应用程序进入中断模式后,这些监视表达式会出现在“监视”窗口中,可在此处观察它们的值。无论何时,只要表达式的值改变或等于一个特定的值,就可把应用程序设置为中断模式来直接观察表达式。例如,在循环计数器达到一个特定值时,可用一个监视表达式把应用程序设置为中断模式,而不是一次一条语句地逐步执行数十次乃至数百次循环。在过程中一个标志的值每次改变时都可能会希望应用程序进入中断模式。,有两种方法可在调试窗口添加监视表达式。(1)通过添加监视命令添加监视表达式的步骤如下:单击调试菜单中的添加监视命令,进入“添加监视”对话窗。在“表达式”框中,输入想要求值的表达式(也可预先用鼠标在程序中标记某一表达式,它将自动填入表达式框中)。在“上下文”框中选取相应的过程或模块。,在“监视类型”框中选取一个选项按钮,决定Visual Basic如何响应观察表达式。如果选取“监视表达式”按钮,则观察表达式的值;若选取“当监视值为真时中断”按钮,只要程序使该表达式取值为真时即中断程序执行;若选取“当监视值改变时中断”按钮,只要程序使该表达式的值发生改变,就中断程序执行。当上述操作完成,点击“确认”按钮,关闭“添加监视”对话窗。,(2)通过快速监视对话框添加监视表达式的步骤如下:在调试窗口的代码段中选取要观察的表达式。单击调试菜单中的快速监视命令或工具条中的快速监视按钮,或从快捷菜单中选取快速监视命令,进入“快速监视”对话窗,“上下文”框中显示相应的过程或模块,“表达式”框中显示表达式,“值”框中显示对应表达式的值。点击“添加”按钮。为了能在调试窗口内查看程序内变量、属性和语句的值,可使用中断模式。中断模式可使程序执行暂停,提供一个查看当前程序情况的机会。在中断模式下,变量和属性设置被保存,这样就可在调试窗口内查看程序内变量、属性和语句的值。进入中断模式可通过逐条语句、断点、Stop语句、键盘交互和观察表达式去发现错误,程序的运行错误也产生中断。,11.2.2 逐语句或逐过程运行 Visual Basic提供逐语句或逐过程两种方式分步运行一个程序。逐语句执行应用程序代码的下一个可执行行,并跟踪到过程中。逐过程执行应用程序代码的下一个可执行行,但不跟踪到过程中。可以联用这两种方式,先用逐语句逐行检查,然后用逐过程跳过已检查过的运行正常的过程。逐语句或逐过程意味着逐行运行程序且检查每条命令。在每行命令运行后,查看程序做了什么。逐行运行和查看程序所用的数据,可以发现程序中所有的错误。如果你不知道错误所在,就必须逐行检查程序的每条命令。按F8或从“调试”菜单中选择“逐语句”或“逐过程”命令可进入指定的运行跟踪方式。如果要停止运行,从“运行”菜单中选择“结束”命令或单击工具栏中的“结束”按钮。,11.2.3 设置断点 对于大程序使用单步运行将令人生厌,可通过设置断点来跳过能正常运行的程序。断点是告诉Visual Basic挂起程序执行的一个标记,当程序执行到断点处即暂停程序的运行,进入中断模式,此时可在调试窗口内查看程序内变量、属性和语句的值。断点可设在怀疑存在问题的地方,断点信号是临时的,不和程序代码存储在一起。可在中断模式下或设计时设置或删除断点,当应用程序处于空闲时,也可在运行时设置或删除断点。,设置或删除断点的步骤:(1)在程序需要设置断点处,将光标停留在该命令行上。(2)按F9键或选择“调试”莱单的“切换断点”命令,或单击工具条的“切换断点”按钮。设置了断点后,Visual Basic将以粗体形式突出显示选定的行,所用颜色为“选项”对话框的“编辑器格式”选项卡上所指定的颜色(默认红色),该对话框可从“工具”菜单中获得。使用同样的方法,可清除当前程序行已设置的断点信号。如果选择“调试”菜单中的“清除所有断点”命令,可同时清除程序中所设置的全部断点。,应用程序一旦运行到断点处并被中止执行,就可检查应用程序的当前状态。检查应用程序的结果是很容易的,因为可以在应用程序的窗体和模块、“代码”窗口以及调试窗口之间移动焦点。由于在执行含有断点的行之前,这个断点中止执行应用程序,因此,如果要观察设有断点的行在运行时发生了什么,就必须至少再运行一个语句,为此要使用逐语句或逐过程运行。,11.3 出 错 处 理,当应用程序处在Visual Basic环境下运行时,如果发生运行错误,Visual Basic将中止应用程序的执行,并退回到Visual Basic环境,程序设计者可通过调试工具纠正错误,并继续运行该程序。但当应用程序处在Windows系统环境下执行时(即以.exe文件启动执行),一旦发生错误,Windows将终止应用程序的执行,并从内存中清除该应用程序的代码,将控制权归还给Windows系统。,显然,Visual Basic这种错误的处理方式不尽合理。调试工具的使用只能用于清除程序代码中存在的错误,无法处理运行过程中发生的非程序语法或语义的错误,幸而Visual Basic提供了一系列运行错误处理的方法和函数。所谓错误处理,就是允许编写的应用程序对错误进行响应。当一个错误发生时,程序能捕捉到这一错误,并可按程序设计者事先设计的方法来处理这一错误。常规下通过以下步骤在应用程序中增加指令捕捉和处理运行错误:(1)设置错误陷阱。在程序适当的地方加入一些语句来捕捉错误,一旦错误发生,程序的运行将转移到错误处理程序,根据所捕获到的错误代码告诉应用程序应当怎样操作。,(2)编写错误处理程序。当程序中出现运行错误时,程序的运行将转到错误处理程序,错误处理程序根据可预知的错误类型决定采取何种措施。Visual Basic提供On Error语句设置错误陷阱,捕捉错误。On Error语句有如下三种形式。On Error Resume Next:当发生错误时,忽略错误行,继续执行下一语句;On Error GoTo语句标号:当发生错误时,使程序转跳到语句标号所指示的程序块;On Error GoTo 0:表示当发生错误时,不使用错误处理程序块;这里的GoTo 0并不指第0行,即使程序过程中有第0行。,当On Error捕捉到错误后,Err对象的Number属性指示对应错误号。于是在错误处理程序块中可使用“Select Case Err.Number”或“If Err.Number=”语句编写出错处理。指令Resume可单独使用,它具有重新执行的能力,提供了退出错误处理程序方法。Resume语句有如下三种形式。Resume:重新执行引起错误的语句或指令;Resume Next:当发生错误时,忽略错误行继续执行下一语句;Resume:当发生错误时,忽略错误行,并转跳到由指明的语句继续执行;若为0,则表示终止程序执行。,【例11-1】下列程序要打开A驱动器上的testfile文件。由于是对A盘操作,就可能存在A盘未准备好或文件不存在的错误。为避免这些错误中止应用程序的执行,可在程序块中设置错误陷阱,当发生错误时,错误处理程序块根据捕捉到的出错号处理出错。Sub OnErrorStatementDemo()Dim Response,Msg,Style,Tille As String 以下语句行设置错误陷阱,当发生错误时跳转到 由标号ErrorHandler指明的错误处理程序块On Error GoTo ErrorHandlerOpen A:testfile For Output As#1Exit Sub 正常退出本程序,ErrorHandler:错误处理块入口 以下语句利用Err对象的Number属性指示的错误号处理出错Select Case Err.NumberCase 53 53号错误为文件不存在,在MsgBox窗内给出出错提示Msg=文件不存在!常数vbRetryCancel在MsgBox窗给出Retry与Cancel按钮 VbCritical提示Stop图标、VbExclamation提示警告图标Style=vbRetryCancel+vbCritical+vbDefaultButton2Title=出错提示,Response=MsgBox(Msg,Style,Title)等待用户处理决定If Response=vbCancel Then 若按下Cancel按钮,放弃处理Exit SubEnd IfCase 71 71号错误为A盘未准备好错误Msg=A盘未准备好Style=vbRetryCancel+vbCritical+vbDefaultButton2Title=提示Response=MsgBox(Msg,Style,Title)If Response=vbCancel ThenExit Sub,End If Case Else 当发生其它不可预知的错误时,退出本程序 MsgBox 其它错误,退出本程序!Exit Sub End Select Resume Resume再次执行原出错语句End Sub,本过程根据Err函数返回的错误号,做相应的错误处理。将错误分为文件不存在和A盘未准备好两种可预知的错误以及其它不可预知的错误。当发生不可预知的错误时,终止本程序的执行,否则,在MsgBox窗内给出出错提示。此时,用户可关闭好A驱动器小门或重插入软盘,再按下Retry按钮,本过程会用Resume命令再次执行原出错语句,若执行成功,则结束,否则,再重复出现MsgBox窗,直至错误排除。若在MsgBox窗内给出出错提示后按下Cancel按钮,变量Response接收到Cancel信息,经If语句判定,退出本程序。,【例11-2】下列程序用于处理企图删除一个已打开的文件所产生的错误。Sub ResumeStatementDemo()On Error GoTo ErrHandler 设置错误陷阱Open testfile For Output As#1Kill testfile 企图删除一个打开的文件Exit SubErrorHandler:Select Case Err.NumberCase 55 55号文件己打开错误Close#1 处理方法:关闭文件 Case Else Endselect ResumeEnd Sub,【例11-3】下列程序采用忽略错误的方法处理错误,错误类型与上例中的错误相同。Sub ResumeStatementDemo()On Error GoTo ErrorHandler 设置错误陷阱Open testfile For Output As#1Kill testfile 企图删除一个打开的文件On Error GoTo 0 关闭错误陷阱On Error Resume Next 忽略Kill testfile出错行指令ObjectRef=GetObject(MyWord.Basic)企图启动一个不存在的对象If Err.Number=440 Then 440OLE自动化出错Msg=“打开OLE对象出错!”,MsgBox Msg Err.Clear 清除出错号 End If Exit Sub ErrorHandler:Select Case Err.Number Case 55 Close#1 Case ElseEnd Select ResumeEnd Sub,本过程中的第一行语句设置错误陷阱,其目的是当发生错误时转跳到由标号Error Handler指明的错误处理程序块。第二行语句打开文件。第三行语句在没有关闭该文件的前提下,企图删除该文件。Err函数返回55号出错号。由于第四行语句On Error Goto 0的作用,关闭了错误陷阱,不使用错误处理程序块而执行第五行语句On Error Resume Next,它使Kill testfile命令无效。第六行语句企图启动一个不存在的对象,产生错误号为440,当If Err.Number语句判定到440错误号后给出提示,然后用Err.Clear清除错误号,使Err.Number属性复位到0。,错误处理是应用程序设计中必须考虑的问题,一般编写错误处理可按Visual Basic所建议的三条错误处理原则进行:(1)编写一个有安全出口的处理程序,使程序中的各种错误最后都有一个归宿。(2)利用Error Err方法作为解决自己无力处理或不可预测错误的最后手段。(3)若不想让函数或过程中出现的错误交由上层程序处理,可用Stop方法结束程序。,【例11-4】下列程序处理由“被零除”、“溢出”和“非法的过程调用”三种情况产生的错误,以下Function过程捕获这些错误并返回Null。(1)界面设计只有一个测试按钮,调用Function过程,用对话框显示结果。(2)程序代码如下:子过程Devide测试运算符的结果 Function Divide(number As Integer,denom As Integer)As Variant Dim Msg As String,声明常量,用于代表被零除、溢出和非法的过程调用三种错误号 Const mnErrDivByZero=11 Const mnErrOverFlow=6 Const mnErrBadCall=5 On Error GoTo MathHandler Divide=number/denom 计算 Exit FunctionMathHandler:If Err.number=mnErrDivByZero Or Err.number=ErrOverFlow _ Or Err.number=ErrBadCall Then Divide=Null 若错误是被零除、溢出或非法过程调用,则返回 Null,Else 显示意想不到的出错信息 Msg=Unanticipated error&Err.number Msg=Msg&:&Err.Description MsgBox Msg,vbExclamation End If 不管什么情况,Resume Next Resume Next 总在Exit函数语句处继续执行End Function 测试按钮,调用函数用对话框显示结果:Private Sub Command1_Click()MsgBox Divide(10,5)End Sub,(3)当除数为0时运行结果如图11.1所示。,图11.1 当除数为0时的出错显示结果,当我们考虑错误处理时,如果要在每个函数或过程中加上出错处理,将导致程序繁冗拖长,大量重复的错误处理代码将使得程序变得累赘。事实上,在一个应用程序中,能出现的错误类型是有限的,我们只要按其性质将其归类,用一个或几个公用的程序处理这些错误就可以了。当某个函数或过程在执行中产生运行错误时,立即调用公用错误处理程序,公用错误处理程序在处理错误后,再返回到上层调用程序继续执行,这种处理方式称为集中式错误处理。下面用一个示例来说明集中式错误处理的方法。,【例11-5】下列程序实现各种与文件或磁盘操作有关的错误处理,整个程序作为一个公用模块(.bas)文件保存于磁盘。在模块文件开头声明常量,用于代表各种与文件或磁盘操作有关的错误号。Public Const errBadFileNameOrNumber=52 不正确的文件名或文件号Public Const errFileNotFound53 文件未找到Public Const errBadFileMode54 文件类型不正确Public Const errFileAlreadyOpen55 文件己打开Public Const errDeviceIO=57 I/O错 Public Const errFileAlreadyExists58 文件己存在Public Const errDiskFull61 磁盘满,Public errInputPastEndOfFile62 超越文件尾端Public Const errBadFileName64 文件名有误Public Const errTooManyFiles67 文件大多Public Const errDeviceUnavailable68 设备未准备好Public Const errDiskNotReady71 驱动器未准备好Public Const errPathDoesNotExist 76 路径不存在,在本模块文件内定义一个文件错误处理函数FileErrors(),其形参errVal代表出错号。当上层程序调用本错误处理函数时,由Err传入出错号给形参errVal,FileErrors()函数利用MsgBox()提示相应的出错信息,并根据用户所选择的错误处理方法通过函数名返回一个出口参数给上层调用本错误处理函数的过程或函数。,出口参数可由用户自行约定,本例中出口参数的含义分别如下:0表示出现其它不可预知的错误,自动跳出FileErrors(),上层程序也将用Error Err方法处理运行错误。,Function FileErrors(errVal As Integer)As Integer 以下三行语句声明变量 Dim MsgType As Integer MsgBox()中按钮类型 Dim Response As Integer 保存用户对MsgBox()的选择 Dim Msg As String MsgBox()中的提示 以下语句设置变量值,使MsgBox()中显示警告信息图标(值48)MsgType=vbExclamation 以下语句根据errVal的值给出不同的提示 Select Case errVal Case errDeviceUnavailable Error#68 Msg=磁盘未格式化或I/O出错 MsgType=vbExclamation+5 5为Retry和Cancel按钮 Case errDiskNotReady Error#71,Msg=驱动器未准备好 Case errDiskFull Msg=磁盘满 Case errBadFileName,errBadFileNameOrNumber Errors#64&52 Msg=文件名非法 Case errPathDoesNotExist Error#76 Msg=路径不存在 Case errBadFileMode Error#54 Msg=文件类型不正确,无法打开 Case errFileAlreadyOpen Error#55 Msg=文件己打开,Case errInputPastEndOfFile Error#62 Msg=有一个不正确的文件结束标志 Msg=Msg+或企图越界读文件 Case Else 如果发生其它不可预知的错误,则设置出错函数返回值为3,跳出本过程 FileErrors=3 Exit Function End Select 如果发生程序中约定的错误,用MsgBox()等待用户选择,根据选 择,给出错函数设置一个返回值 Response=MsgBox(Msg,MsgType,出错处理),Select Case Response Case 1,4 按OK或Retry按钮 FileErrors=0 出错函数返回0,用Resume方法 Case 5 按Ignore按钮 FileErrors=1 函数返回1,用Resume Next方法 Case 2,3 按Cancel或Abort按钮 FileErrors=2 出错函数返回2,用Error Err方法 Case Else FileErrors=3 其它情况返回3,用Error Err方法 End SelectEnd Function,以下代码用于说明如何调用出错函数FileErrors()。函数FileOpener的功能是模拟文件打开对话框,形参NewFileName指定文件名,文件打开不成功,FileOpener返回0。Function FileOpener(NewFileName As String)As IntegerDim NewFileNum As Integer 新文件号Dim FileExists As lnteger 标记文件存在否Dim Action As Integer 错误选择Dim Msg As StringOn Error GoTo OpenerError 设置错误陷阱 以下If句判定文件名是否合法If NewFileName Like*;-?*Or NewFileName Like*Then,Error errBadFileName 常量errBadFileName=64 End If 以下If语句判定文件存在否,用变量FileExists标记文件是否存在 If Dir(NewFileName)=Then FileExists=False Else FileExists=True End IfIf Not FileExists Then 如果文件不存在,用MsgBox()让用户选择是否要建立新文件 Msg=文件+NewFileName+不存在 Msg=Msg+是否要建立?,If MsgBox(Msg,1,建立文件?)=2 Then 用户选择不要建立新文件 FileOpener=0 Exit Function End IfEnd IfNewFileNum=FreeFile 调用函数子过程FreeFile,确定文件号 用Open语句打开指定的文件Open NewFileName For Output As NewFileNumFileOpener=NewFileNumExit FunctionOpenerError:,如果发生错误,调用文件错误处理函数FileErrors(),Err将错误号 传递给FileErrors()处理,并将返回值赋予变量ActionAction=FileError(Err)Select Case Action Case 0 Resume Case Else FileOpener=0 Exit FunctionEnd SelectEnd Function,Visual Basic提供了Error和Error$函数用于返回错误代码和出错信息,其语法格式为:Error错误代码和Error$错误代码 错误代码必须是132 767之间的整数。当错误代码被省略时,返回运行错误对应的字符串信息。,【例11-6】本程序块使用错误代码输出出错提示。For ErrorNumber=61 To 64 使用数值6164控制循环Print Error(ErrorNumber)输出出错提示Next ErrorNumber 当测试应用程序,或想要处理等价于Visual Basic运行时错误的具体条件时,对错误进行模拟是非常有用的。例如,用一个定义在外部应用程序中的对象编写模块并希望应用程序的其余部分把该对象返回的错误作为实际的Visual Basic错误来处理。在代码中可用Raise方法捕捉错误。,object.Raise argumentlist 通常,object参数是Err,它是Visual Basic定义的全局错误对象。argumentlist参数是命名的参数列表,这些参数可通过方法传递。例如,使用代码“Err.Raise Number71”模拟“磁盘未准备”错误。,习 题 十 一,11.1 概述Visual Basic程序调试中错误类型的分类。11.2 编写除数为0时的错误捕获程序。,

    注意事项

    本文(【教学课件】第11章程序调试和出错处理.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开