大家知道,即使程序员抱有最好的愿望,而且计划工作做得非常周密,也无法避免代码出现错 误。实际上可能出现的程序错误是很多的,但是它们基本上可以分为两种类型:一种是编译错误;另一种 是运行期错误。编译错误是指使得 Visual Bacsic(下面简称 VB)的编译器无法对代码进行编译的错误。 如果一个过程中包含了编译错误,VB 将不执行该过程,并且我们也不能向用户提供带有编译错误的运行期 版本应用程序,大多数编译错误是句法错误造成的。
一、VB 的编译选项
VB 有两个设置项会在很大程度上影响我们创建非常坚实的代码的能力。一个设置项是 Compile On Demand(按需要进行编译),另一个设置项是 Background Compile(后台编译)。可以打开 Options 对话框,选定 General 选项卡,然后对这两个设置项进行设置。
当选定 Compile On Demand 时,如果单击工具栏上的 Run 按钮,或者按 F5 键,VB 并不全面编译我们的项目。相反,只在引用过程时, 才对这些过程进行编译。使用 Compile On Demand,通常可使比较大的项目或者速度较慢的计算机上的项 目能够更快地启动运行,但是它也会产生某些不被注意的编译错误。 在发现和纠正所有编译错误之前,不能将项目编译成.exe 或.dll 之类的可发布文件,因此,选定 Compile On Demand 并不能够发布带有编译错误的代码。但是,选定 Compile On Demand 后,会导致编 译错误随着时间的推移而不断增加,从而在最后试图进行全面编译时,迫使我们对代码进行大量的纠错。 如果在 IDE 中调试项目,VB 常常必须停止(不只是暂停)运行,以便进行纠错操作。这使得调试正在运 行的项目时对大量编译错误的纠正操作变得非常麻烦。如果能够在合理的时间内全面编译项目,那么可以 考虑关闭 Compile On Demand。也可以使 Compile On Demand 保持选定状态,但是要定期按 Ctrl+F5 键, 以便重新运行我们的项目。这使我们在编程时能够定期纠正编译错误,而不必一次性纠正大量的编译错误。 图 1编译时选中 Compile On Demand 和 Background Compile 两个选项。
二、Err 对象
在能够编写有效的错误处理代码之前,我们必须了解 VB 的 Err 对象,这是个运行期对象,它包 含了关于最新错误的信息。当程序运行时遇到一个错误,或者当我们使用 Err 对象的 Raise 方法故意引发 一个错误时,便形成 Err 对象的属性。当遇到 On Error 语句(比如 On Error Resume Next),并且在使用 Exit Sub、Exit Function 或 Exit Property 语句退出一个过程后,Error 对象的属性值就被清除。若要显式清 除 Err 对象,可以调用它的 Clear 方法。下表 1 列出了 Err 对象的属性。 属性 说明 Number 用于标识该错误的专用号码 Source 当前 VB 项目的名字 Description 表义性的错误消 息。如果某个错误没有这个字符串,本属性就会指明"应用程序定义的错误或对象定义的错误" HelpFile 与 错误相关的 VB 帮助文件所在的驱动器、路径和文件名 HelpContext VB 帮助文件用于该错误的上下文 ID LastDLLError 在 32 位 Microsoft Windows 操作系统上,上次调用动态链接库(DLL)的系统错误代码。LastDllError 属性是只读属性
三、错误处理程序的类型
将一个项目当作已经编译的程序运行时,未捕获的错误会造成致命的后果,它们会导致程序终 止运行。必须尽一切努力防止发生这种情况。若要防止代码中的错误中断代码的运行(并终止已编译程序 的运行),我们可以创建错误处理程序以捕获代码中的错误。当捕获一个错误后,VB 并不显示出错消息, 也不终止代码的运行。相反,我们编写的专门用来处理错误的代码则开始运行。每个过程都应该拥有错误 处理程序,而不管它包含多大的代码量。最好在代码中放入一个 On Error 语句,作为代码的第一行,放在 紧靠过程标题的后面和变量说明的前面。如果一个过程的错误能够以这种方式出现,就应该在过程的开头 用突出的注释来明确说明这一行为特性。 若要捕获错误,基本上可以使用下面两种方法: 当出现错误时,使用 On Error GoTo,转移到别的代码上去执行。 使用 On Error Resume Next 语句,不中断代码的执行,也不转移到别的代码上去执行,而是 忽略该错误。 可以在一个过程中创建多个错误处理程序 但每次只能激活一个错误处理程序 VB 将最新的 On Error , 。 语句中指明的处理程序视为已经激活的错误处理程序。切换一个过程中的不同位置上的错误处理程序,往 往是很有好处的,理解各个错误处理程序如何运行,是利用这一功能的关键。
1、使用 On Error Resume Next 以忽略错误 对错误进行处理的最简单(和最危险)的方法是使用 On Error Resume Next 语句。On Error Resume Next 语句规定,代码中的错误将完全被忽略,存在错误的代码行被跳过,然后继续执行下一个语 句。例如,下面这个过程存在一个运行期错误(即一个被 0 除的错误),它由 On Error Resume Next 错 误处理程序来处理: Private Sub cmdGenerateError_Click() '* Purpose: Test On Error Resume Next On Error Resume Next Debug.Print 10 / 0 End Sub Debug.print 语句产生了一个被 0 除的错误。但是,由于存在一个已经激活的错误处理程序(由 On Error Resume Next 指定),因此该错误被忽略,并在下一个语句(即 End Sub 语句)上恢复执行。 错误被忽略并不意味着我们无法知道错误已经发生。当一个语句产生了一个错误之后,尽管没有显示出错 消息,Err 对象仍然包含关于该错误的信息。
2、使用 On Error GoTo 转移执行的代码流 除非我们捕获了一个意料之外的错误,比如上面代码中的那种错误,否则忽略代码中的错误是 非常危险的,并且是一种不得已时采用的办法。当一个过程中出现了意料之外的错误时,该过程就会产生 许多问题。如果忽略该错误,就会对用户产生严重的影响,比如数据没有保存,或者保存不正确。许多情 况下,当出现代码错误时,必须执行某些操作,将代码的执行转移到 On Error GoTo 语句中指定的错误处 理程序。该语句的句法如下: On Error GoTo line 请注意,line 必须是指与 On Error GoTo 语句相同的过程中的一个语句。 在这个句法中, line 有两个意思。首先它是指出现错误时要转移到的这个代码行号。不过这个 行号并不是过程中的代码行的物理位置。请看下面这个代码例子: Private Sub TestErrorHandler() '* Purpose : Test the On Error GoTo statement by deliberately '* generating a run-timeerror. On Error GoTo 4 Debug.Print "Line 2" Debug.Print 10 / 0 Debug.Print "Line 4" Debug.Print "Line 5" End Sub 我们可能认为,被 0 除的错误会导致代码在输出文本 line 4 这个语句上继续执行,因为这是代码 的第四个语句(不是计数注释)。不仅这种情况不会发生,而且该代码实际上会导致产生一个编译错误, 并且代码根本不会执行。
3、用调试方式激活错误处理程序和取消其激活状态 虽然我们不希望已编译程序中的错误不被捕获,但是,当程序在 IDE 中运行时如果出现错误, 让 VB 中止代码的执行,这样做常常是非常不利的。当代码的执行中止时,会看到一条相关的出错消息, 并告诉我们出现错误的代码行,这对于代码的调试来说是大有帮助的。VB 为处理代码设计时遇到的错误而 使用的方法取决于 VB IDE 的 Error Trapping(捕获错误)属性。Error Trapping 属性是 VB 环境的一个属 性,不是某个项目的属性。我们操作的每个项目,即使在关闭和重新启动 VB 之后,均使用该设置值。若 要为 VB 的当前会话设置 Error Trapping 选项,而不必为将来的会话修改默认值,请使用代码窗口的快捷 菜单上的 Toggle 命令。 从任何代码窗口的快捷菜单中选择 Toggle 命令 可以将 Error Trapping 属性设置为下列值中的一个: Break On All Errors(在所有错误上中止)。
Break In Class Module(在类模块中中止)。
Break On Unhandled Errors(在未处理的错误上中止)。
Break On All Errors 实际上可使所有错误处理程序均取消激活状态。当出现一个错误时,无论是 否激活了处理程序,代码均在出错的语句上进入中止方式,同时 VB 显示一条出错消息。这使我们能够在 IDE 进行测试时处理意料不到的错误。
原文链接:https://www.f2er.com/vb/259638.html