标题：On Error
On Error 语句
启动一个错误处理程序并指定该子程序在一个过程中的位置；也可用来禁止一个错误处理程序。
语法On Error GoTo line 、On Error Resume Next、On Error GoTo 0
On Error 语句的语法可以具有以下任何一种形式的语句描述：On Error GoTo line启动错误处理程序，且该例程从必要的 line 参数中指定的 line 开始。line 参数可以是任何行标签或行号。如果发生一个运行时错误，则控件会跳到 line，激活错误处理程序。指定的 line 必须在一个过程中，这个过程与 On Error 语句相同； 否则会发生编译时间错误。On Error Resume Next说明当一个运行时错误发生时，控件转到紧接着发生错误的语句之后的语句，并在此继续运行。访问对象时要使用这种形式而不使用 On Error GoTo。On Error GoTo 0禁止当前过程中任何已启动的错误处理程序。
说明：如果不使用 On Error 语句，则任何运行时错误都是致命的；也就是说，结果会导致显示错误信息并中止运行。一个“允许的”错误处理程序是由 On Error 语句打开的一个处理程序；一个“活动的”错误处理程序是处理错误的过程中允许的错误处理程序。如果在错误处理程序处于活动状态时（在发生错误和执行 Resume、Exit Sub、Exit Function 或 Exit Property 语句之间这段时间）又发生错误，则当前过程的错误处理程序将无法处理这个错误。控件返回调用的过程。如果调用过程有一个已启动的错误处理程序，则激活错误处理程序来处理该错误。如果调用过程的错误处理程序也是活动的，则控件将再往回传到前面的调用过程，这样一直进行下去，直到找到一个被允许的但不是活动的错误处理程序为止。如果没有找到被允许而且不活动的错误处理程序，那么在错误实际发生的地方，错误本身是严重的。错误处理程序每次将控件返回调用过程时，该过程就成为当前过程。在任何过程中，一旦错误处理程序处理了错误，在当前过程中就会从 Resume 语句指定的位置恢复运行。注意 一个错误处理程序不是 Sub 过程或 Function 过程。它是一段用行标签或行号标记的代码。错误处理程序依靠 Err 对象的 Number 属性中的值来确定错误发生的原因。在其它任何错误发生之前，或在调用一个可能会导致错误发生的过程之前，错误处理程序应该先测试或存储 Err 对象中相关的属性值。Err 对象中的属性值只反映最近发生的错误。Err.Description 中包含有与 Err.Number 相关联的错误信息。On Error Resume Next 会使程序从紧随产生错误的语句之后的语句继续执行，或是从紧随最近一次调用含有 On Error Resume Next 语句的过程的语句继续运行。这个语句可以置运行时错误于不顾，使程序得以继续执行。可以将错误处理程序放置在错误发生的地方，而不必将控件传输到过程中的其它位置。在调用另一个过程时，On Error Resume Next 语句成为非活动的，所以，如果希望在例程中进行嵌入错误处理，则应在每一个调用的例程中执行 On Error Resume Next 语句。注意 当处理在访问其它对象期间产生的错误时，与其使用 On Error GoTo 指令，不如使用 On Error Resume Next。每次和对象打交道，在不知道用代码访问哪个对象时，检查一下 Err 都会打消这种疑虑。可以确定是哪个对象产生错误（Err.Source 中指定的对象），也可以确定是哪个对象将错误代码放在 Err.Number 中。On Error GoTo 0 停止在当前过程中处理错误。即使过程中包含编号为 0 的行，它也不把行 0 指定为处理错误的代码的起点。如果没有 On Error GoTo 0 语句，在退出过程时，错误处理程序会自动关闭。在错误未发生的时候，为了防止错误处理程序代码运行，请像在下段程序中那样，在紧靠着错误处理程序的前面写入 Exit Sub、Exit Function 或 Exit Property 语句。Sub InitializeMatrix(Var1, Var2, Var3, Var4)   On Error GoTo ErrorHandler   . . .   Exit SubErrorHandler:   . . .   Resume NextEnd Sub此处，错误处理程序代码在 Exit Sub 语句之后，而在 End Sub 语句之前，从而与过程中的流程分开。错误处理程序代码可以在程序中的任何地方写入。当对象作为文件运行时，对象中未捕获的错误都被返回控制应用程序。在开发环境中，如果设置了正确选项，未捕获的错误只返回控制应用程序。请参考主应用程序的文档的有关描述，从而得知，在调试时应该设置哪些选项、如何设置这些选项以及主机能否建立类。如果建立一个访问其它对象的对象，则应该着手处理从那些对象返回的未处理错误。如果无法处理这种错误，请将 Err.Number 中的错误代码当作自己的一个错误，然后将错误回传给对象的调用者。应该将错误代码添加到 vbObjectError 常数上来指定这个错误。举例来说，如果错误代码为 1052，则使用如下方法指定错误：Err.Number = vbObjectError + 1052注意 调用动态链接库 (DLL) 期间产生的系统错误不会产生例外情况，也不会被 Visual Basic 的错误捕获操作所捕获。当调用 DLL 函数时，应该（根据 API 的详细说明）检查每一个返回值以确定是成功还是失败，如果失败，则检查 Err 对象的 LastDLLError 属性中的值。
使用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对象仍然包含关于该错误的信息。
使用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这个语句上继续执行，因为这是代码的第四个语句（不是计数注释）。不仅这种情况不会发生，而且该代码实际上会导致产生一个编译错误，并且代码根本不会执行。
调试激活错误处理程序、取消其激活状态
虽然我们不希望已编译程序中的错误不被捕获，但是，当程序在IDE中运行时如果出现错误，让VB中止代码的执行，这样做常常是非常不利的。当代码的执行中止时，会看到一条相关的出错消息，并告诉我们出现错误的代码行，这对于代码的调试来说是大有帮助的。VB为处理代码设计时遇到的错误而使用的方法取决于VB IDE的Error Trapping（捕获错误）属性。Error Trapping属性是VB环境的一个属性，不是某个项目的属性。我们操作的每个项目，即使在关闭和重新启动VB之后，均使用该设置值。若要为VB的当前会话设置Error Trapping选项，而不必为将来的会话修改默认值，请使用代码窗口的快捷菜单上的Toggle命令。 
可以将Error Trapping属性设置为下列值中的一个： 
Break On All Errors（在所有错误上中止）。 
Break In Class Module（在类模块中中止）。 
Break On Unhandled Errors（在未处理的错误上中止）。 
Break On All Errors实际上可使所有错误处理程序均取消激活状态。当出现一个错误时，无论是否激活了处理程序，代码均在出错的语句上进入中止方式，同时VB显示一条出错消息。这使我们能够在IDE进行测试时处理意料不到的错误。