第11章程序调试和出错处理第11章程序调试和出错处理11.1 错误类型11.2 调试和排错11.3 出错处理习题十一第11章程序调试和出错处理11.1 错误类型1语法错误当编写代码时Visual Basic会对程序进行语法检查当发现程序中存在打字错误、遗漏关键字或标点符号使用不当等语法错误时Visual Basic在Form窗口中弹出一个子窗口弹出窗口代码编写
提示出错信息出错的那一行变成红出错部分被高亮度显示这时用户必须单击“确定”按钮关闭出错提示窗然后对出错行进行修改。第11章程序调试和出错处理2编译错误编译错误指Visual Basic在编译应用程序时由于用户未定义变量、遗漏关键字等原因产生的不正确的代码而引起的错误。这时Visual Basic也弹出一个子窗口提示出错信息出错的那一行被高亮度显示同时Visual Basic停止编译。这时用户必须单击“确定”按钮关闭出错提示窗然后对出错行进行修改。第11章程序调试和出错处理3
运行错误运行错误指Visual Basic在运行代码时发生的错误这类错误往往是指令代
码执行了一非法操作引起的。例如除法时分母为零。有时即使调用Visual Basic或Windows系统提供的标准系统函数或过程也会发生错误。例如当调用Visual Basic的Dir 函数判断一个文件是否存在时若被操作的驱动器未准备好或磁盘读写有错就会发生错误。运行错误也将弹出一个子窗口提示出错信息。窗口内第一行显示运行错误代号第二行显示出错说明。在窗口的下方给出4个按钮分别是“继续”、“结束”、“调试”和“帮助”这时可选择一个按钮决定如何处理错误。第11章程序调试和出错处理1选择“帮助”按钮VisualBasic将提
供这一错误的帮助信息包括错误说明、错误代号和引起该错误的可能原因用户可参考提示排除错误。2选择“调试”按钮进入调试窗光标停留在引起出错的那一句上此时允许修改代码。3 选择“结束”按钮结束本程序的运行。第11章程序调试和出错处理4逻辑错误程序运行后得不到所期望的结果这说明程序存在逻辑错误。这类错误往往是程序存在逻辑上的缺陷所引起的。例如使用了不正确的变量类型或指令的次序不对。又如循环中起终值不正确。逻辑错误也可以产生运行错误。通常逻辑错误不会产生错误提示信息故错误较难排除需要程序员仔细地阅读分析程序。第11章程序调试和出错处理11.2 调试和排错11.2.1调试窗口在逐行运行应用程序的语句时可用调试窗口监视表达式和变量的值。有三个调试窗口它们是“立即”窗口、“监视”窗口和“本地”窗口。可单击视图菜单中的对应命令打开这些窗口。1 “立即”窗口显示代码中正在调试的语句所产生的信息或直接往窗口中键入的命令所请求的信息。例如使用Print语句打印表达式的值也可以在程序代码中利用Debug.Print方法把输出送到“立即”窗口。第11章程序调试和出错处理2“本地”窗口显示当前过程中所有变量的值。当程序的执行从一个过程切换到另一个过程时“本地”窗口的内容会发生改变它只反映当前过程中可用的变量。3“监视”窗口显示当前的监视表达式在代码运行过程中可决定是否监控这些表达式的值。中断表达式是一个监视表达式当定义的某个条件为真时它将使VisualBasic进入中断模式。在“监视”窗口中“上下文”列指出过程、模块每个监视表达式都在这些过程或模块中进行计算。只有当前语句在指定的上下文中时“监视”窗口才能显示监视表达式的值。否则“值”列只显示一条消息指出语句不在上下文中“类型”列指明表达式类型监视窗内列的宽度可用鼠标拖曳列之间的分界线来调整。第11章程序调试和出错处理Visual Basic自动对监视表达式进行监视。当应用程序进入
中断模式后这些监视表达式会出现在“监视”窗口中可在此处观察它们的值。无论何时只要表达式的值改变或等于一个特定的值就可把应用程序设置为中断模式来直接观察表达式。例如在循环计数器达到一个
特定值时可用一个监视表达式把应用程序设置为中断模式而不是一次一条语句地逐步执行数十次乃至数百次循环。在过程中一个标志的值每次改变时都可能会希望应用程序进入中断模式。第11章程序调试和出错处理有两种方法可在调试窗口添加监视表达式。1通过添加监视命令添加监视表达式的步骤如下①单击调试菜单中的添加监视命令进入“添加监视”对话窗。②在“表达式”框中输入想要求值的表达式也可预先用鼠标在程序中标记某一表达式它将自动填入表达式框中。③在“上下文”框中选取相应的过程或模块。第11章程序调试和出错处理④在“监视类型”框中选取一个选项按钮决定VisualBasic如何响应观察表达式。如果选取“监视表达式”按钮则观察表达式的值若选取“当监视值为真时中断”按钮只要程序使该表达式取值为真时即中断程序执行若选取“当监视值改变时中断”按钮只要程序使该表达式的值发生改变就中断程序执行。当上述操作完成点击“确认”按钮关闭“添加监视”对话窗。第11章程序调试和出错处理2通过快速监视对话框添加监视表达式的步骤如下①在调试窗口的代码段中选取要观察的表达式。②单击调试菜单中的快速监视命令或工具条中的快速监视按钮或从快捷菜单中选取快速监视命令进入“快速监视”对话窗“上下文”框中显示相应的过程或模块“表达式”框中显示表达式“值”框中显示对应表达式的值。③点击“添加”按钮。为了能在调试窗口内查看程序内变量、属性和语句的值可使用中断模式。中断模式可使程序执行暂停提供一个查看当前程序情况的机会。在中断模式下变量和属性设置被保存这样就可在调试
窗口内查看程序内变量、属性和语句的值。进入中断模式可通过逐条语句、断点、Stop语句、键盘交互和观察表达式去发现错误程序的运行错误也产生中断。第11章程序调试和出错处理11.2.2逐语句或逐过程运行VisualBasic提供逐语句或逐过程两种方式分步运行一个程序。逐语句执行应用程序代码的下一个可执行行并跟踪到过程中。逐过程执行应用程序代码的下一个可执行行但不跟踪到过程中。可以联用这两种方式先用逐语句逐行检查然后用逐过程跳过已检查过的运行正常的过程。逐语句或逐过程意味着逐行运行程序且检查每条命令。在每行命令运行后查看程序做了什么。逐行运行和查看程序所用的数据可以发现程序中所有的错误。如果你不知道错误所在就必须逐行检查程序的每条命令。按F8或从“调试”菜单中选择“逐语句”或“逐过程”命令可进入指定的运行跟踪方式。如果要停止运行从“运行”菜单中选择“结束”命令或单击工具栏中的“结束”按钮。第11章程序调试和出错处理11.2.3设置断点对于大程序使用单步运行将令人生厌可通过设置断点来跳过能正常运行的程序。断点是告诉Visual Basic挂起程序执行的一个标记当程序执行到断点处即暂停程序的运行进入中断模式此时可在调试窗口内查看程序内变量、属性和语句的值。断点可设在怀疑存在问题的地方断点信号是临时的不和程序代码存储在一起。可在中断模式下或设计时设置或删除断点当应用程序处于空闲时也可在运行时设置或删除断点。第11章程序调试和出错处理设置或删除断点的步骤1在程序需要设置断点处将光标停留在该命令行上。2按F9键或选择“调试”莱单的“切换断点”命令或单击工具条的“切换断点”按钮。设置了断点后Visual Basic 将以粗体形式突出显示选定的行所用颜为“选项”对话框的“编辑器格式”选项卡上所指定的颜默认红该对话框可从“工具”菜单中获得。使用同样的方法可清除当前程序行已设置的断点信号。如果选择“调试”菜单中的“清除所
有断点”命令可同时清除程序中所设置的全部断点。第11章程序调试和出错处理应用程序一旦运行到断点处并被中止执行就可检查应用程序的当前状态。检查应用程序的结果是很容易的
因为可以在应用程序的窗体和模块、“代码”窗口以及调试窗口之间移动焦点。由于在执行含有断点的行之前这个断点中止执行应用程序因此如果要观察设有断点的行在运行时发生了什么就必须至少再运行一个语句为此要使用逐语句或逐过程运行。第11章程序调试和出错处理11.3 出错处理当应用程序处在Visual Basic环境下运行时如果发生运行错误Visual Basic将中止应用程序的执行并退回到Visual Basic环境程序设计者可通过调试工具纠正错误并继续运行该程序。但当应用程序处在Windows系统环境下执行时即以.exe文件启动执行一旦发生错误Windows将终止应用程序的执行并从内存中清除该应用程序的代码将控制权归还给Windows系统。第11章程序调试和出错处理显然VisualBasic这种错误的处理方式不尽合理。调试工具的使用只能用于清除程序代码中存在的错误无法处理运行过程中发生的非程序语法或语义的错误幸而VisualBasic提供了一系列运行错误处理的方法和函数。所谓错误处理就是允许编写的应用程序对错误进行响应。当一个错误发生时程序能捕捉到这一错误并可按程序设计者事先设计的方法来处理这一错误。常规下通过以下步骤在应用程序中增加指令捕捉和处理运行错误1 设置错误陷阱。在程序适当的地方加入一些语句来捕捉错误一旦错误发生程序的运行将转移到错误处理程序根据所捕获到的错误代码告诉应用程序应当怎样操作。第11章程序调试和出错处理2编写错误处理程序。当程序中出现运行错误时程序的运行将转到错误处理程序错误处理程序根据可预知的错误类型决定采取何种措施。Visu
alBasic提供OnError语句设置错误陷阱捕捉错误。OnError语句有如下三种形式。OnErrorResumeNext当发生错误时忽略错误行继续执行下一语句OnErrorGoTo语句标号当发生错误时使程序转跳到语句标号所指示的程序块On Error GoTo 0表示当发生错误时不使用错误处理程序块这里的GoTo 0并不指第0行即使程序过程中有第0行。第11章程序调试和出错处理当OnError 捕捉到错误后Err对象的Number属性指示对应错误号。于是在错误处理程序块中可使用“SelectCaseErr.Number”或“IfErr.Number”语句编写出错处理。指令Resume可单独使用它具有重新执行的能力提供了退出错误处理程序方法。Resume语句有如下三种形式。Resume重新执行引起错误的语句或指令ResumeNext当发生错误时忽略错误行继续执行下一语句Resume lt标号gt当发生错误时忽略错误行并转跳到由lt标号gt 指明的语句继续执行若lt标号gt为0则表示终止程序执行。第11章程序调试和出错处理【例11-1】下列程序要打开A驱动器上的testfile文件。由于是对A盘操作就可能存在A盘未准备好或文件不存在的错误。为避免这些错误中止应用程序的执行可在程序块中设置错误陷阱当发生错误时错误处理程序块根据捕捉到的出错号处理出错。SubOnErrorStatementDemoDimResponseMsgStyleTilleAsString以下语句行设置错误陷阱当发生错误时跳转到由标号ErrorHandler指明的错误处理程序块OnErrorGoToErrorHandlerOpenquotA:testfilequotForOutputAs1Exit Sub 正常退出本程序第11章程序调试和出错处理ErrorHandler: 错误处理块入口以下语句利用Err 对象的Number属性指示的错误号处理出错Select Case Err.NumberCase 53 53号错误为quot文件不存在quot在MsgBox窗内给出出错提示Msg quot文件不存在quot 常数vbRetryCancel在MsgBox窗给出Retry与Cancel按钮VbCritical提示Stop图标、VbExclamation提示警告图标Style vbRetryCancel vbCritical
vbDefaultButton2Title quot出错提示quot 第11章程序调试和出错处理Response MsgBoxMsg Style Title 等待用户处理决定If Response vbCancel Then 若按下
Cancel按钮放弃处理Exit SubEnd IfCase 71 71号错误为quotA盘未准备好quot错误Msg quotA盘未准备好quotStyle vbRetryCancel vbCritical
vbDefaultButton2Title quot提示quotResponse MsgBoxMsg Style TitleIf Response vbCancel ThenExit Sub 第11章程序调试和出错处理End IfCase Else 当发生其它不可预知的错误时退出本程序MsgBox quot其它错误退出本程序quotExit SubEnd SelectResume Resume再次执行原出错语句End Sub第11章程序调试和出错处理本
过程根据Err函数返回的错误号做相应的错误处理。将错误分为文件不存在和A盘未准备好两种可预知的错误以及其它不可预知的错误。当发生不可预知的错误时终止本程序的执行否则在MsgBox窗内给出出错提示。此时用户可关闭好A驱动器小门或重插入软盘再按下Retry按钮本过程会用Resume命令再次执行原出错语句若执行成功则结束否则再重复出现MsgBox窗直至错误排除。若在MsgBox窗内给出出错提示后按下Cancel按钮变量Response接收到Cancel信息经If语句判定退出本程序。第11章程序调试和出错处理【例11-2】下列程序用于处理企图删除一个已打开的文件所产生的错误。Sub ResumeStatementDemo On Error GoTo ErrHandler 设置错误陷阱Open quottestfilequot For Output As
1Kill quottestfilequot 企图删除一个打开的文件Exit SubErrorHandler:Select Case Err.NumberCase 55 55号quot文件己打开quot错误Close 1 处理方法关闭文件Case Else…EndselectResu meEnd Sub 第11章程序调试和出错处理【例11-3】下列程序采用忽略错误的方法处理错误错误类型与上例中的错误相同。SubResumeStatementDemoOnErrorGoToErrorHandler设置错误陷阱OpenquottestfilequotForOutputAs1Killquottestfilequot企图删除一个打开的文件OnErrorGoTo0关闭错误陷阱OnErrorResumeNext忽略Killquottestfilequot出错行指令ObjectRefGetObjectquotMyWord.Basicquot企图启动一个不存在的对象
IfErr.Number440Then440OLE自动化出错Msg “ 打开OLE对象出错”第11章程序调试和出错处理MsgBox MsgErr.Clear 清除出错号End IfExit SubErrorHandler:Select Case Err.NumberCase 55Close 1Case ElseEnd SelectResumeEnd Sub 第11章程序调试和出错处理本过程中的第一行语句设置错误陷阱其目的是当发生错误时转跳到由标号ErrorHandler指明的错误处理程序块。第二行语句打开文件。第三行语句在没有关闭该文件的前提下企图删除该文件。Err函数返回55号出错号。由于第四行语句OnErrorGoto0的作用关闭了错误陷阱不使用错误处理程序块而执行第五行语句OnErrorResumeNext它使Killquottestfilequot命令无效。第六行语句企图启动一个不存在的对象产生错误号为440当If Err.Number语句判定到440错误号后给出提示然后用Err.Clear清除错误号使Err.Number属性复位到0。第11章程序调试和出错处理错误处理是应用程序设计中必须考虑的问题一般编写错误处理可按VisualBasic
所建议的三条错误处理原则进行1编写一个有安全出口的处理程序使程序中的各种错误最后都有一个归宿。2利用ErrorErr方法作为解决自己无力处理或不可预测错误的最后手段。
3 若不想让函数或过程中出现的错误交由上层程序处理可用Stop方法结束程序。第11章程序调试和出错处理【例11-4】下列程序处理由“被零除”、“溢出”和“非法的过程调用”三种情况产生的错误以下Function过程捕获这些错误并返回Null。1界面设计只有一个测试按钮调用Function过程用对话框显示结果。2程序代码如下子过程Devide测试运算符的结果FunctionDividenumberAsIntegerdenomAsIntegerAsVariantDim Msg As String 第11章
程序调试和出错处理声明常量用于代表被零除、溢出和非法的过程调用三种错误号Const mnErrDivByZero 11Const mnErrOverFlow 6Const mnErrBadCall 5On Error GoTo MathHandlerDivide number / denom 计算Exit FunctionMathHandler:If
Err.number mnErrDivByZero Or Err.number ErrOverFlow _Or Err.number ErrBadCall ThenDivide Null 若错误是被零除、溢出或非法过程调用则返回Null 第11章程序调试和出错处理Else 显示意想不到的出错信息Msg quotUnanticipated errorquot amp Err.numberMsg Msg amp quot:quot amp Err.DescriptionMsgBox Msg vbExclamationEnd If 不管什么情况Resume NextResume Next 总在Exit函数语句处继续执行End Function 测试按钮调用函数用对话框显示结果Private Sub Command1_Click Ms
gBox Divide10 5End Sub 第11章程序调试和出错处理3 当除数为0时运行结果如图11.1所示。图11.1 当除数为0时的出错显示结果第11章程序调试和出错处理当我们考虑错误处理时如果要在每个函数或过程中加上出错处理将导致程序繁冗拖长大量重复的错误处理代码将使得程序变得累赘。事实上在一个应用程序中能出现的错误类型是有限的我们只要按其性质将其归类用一个或几个公用的程序处理这些错误就可以了。当某个函数或过程在执行中产生运行错误时立即调用公用错误处理程序公用错误处理程序在处理错误后再返回到上层调用程序继续执行这种处理方式称为集中式错误处理。下面用一个示例来说明集中式错误处理的方法。第11章程序调试和出错处理【例11-5】下列程序实现各种与文件或磁盘操作有关的错误处理整个程序作为一个公用模块.bas文件保存于磁盘。在模块文件开头声明常量用于代表各种与文件或磁盘操作有关的错误号。PublicConsterrBadFileNameOrNumber52不正确的文件名或文件号PublicConsterrFileNotFound53文件未到PublicConsterrBadFileMode54文件类型不正确PublicConsterrFileAlreadyOpen55文件己打开Public Const errDeviceIO 57 ?? I/O 错PublicConsterrFileAlreadyExists58文件己存在Public Const errDiskFull61 磁盘满第11章程序调试和出错处理Public errInputPastEndOfFile62 超越文件尾端Public Const errBadFileName64 文件名有误Public Const errTooManyFiles67 文件大多Public Const errDeviceUnavailable68 设备未准备好Public Const errDiskNotReady71 驱动器未准备好Public Const errPathDoesNotExist 76 路径不存在在本模块文件内定义一个文件错误处理函数FileErrors其形参errVal代表出错号。当上层程序调用本错误处理函数时由Err传入出错号给形参errValFileErrors函数利用MsgBox提示相应的出错信息并根据用户所选择的错误处理
方法通过函数名返回一个出口参数给上层调用本错误处理函数的过程或函数。第11章程序调试和出错处理出口参数可由用户自行约定本例中出口参数的含义分别如下0amp0amp0选择OK或Retry按钮表示上层程序将用Resume方法处理运行错误。1—选择Ignore按钮表示上层程序忽略当前错误将用ResumeNext方法处理运行错误2—选择Cancel或About按钮表示出现了不可恢复的错误上层程序将用ErrorErr方法处理运行错误3—0amp0amp0表示出现其它不可预知的错误自动跳出FileErrors 上层程序也将用Error Err方法处理运行错误。第11章程序调试和出错处理Function FileErrorserrVal As Integer As Integer 以下三行语句声明变量Dim MsgType As Integer MsgBox 中按钮类型Dim Response As Integer 保存用户对MsgBox 的选择Dim Msg As String MsgBox 中的提示以下语句设置变量值使MsgBox 中显示警告信息图标值48MsgType vbExclamation 以下语句根据

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。