On Error 语句

启用错误处理例程并指定该例程在程序中的位置;还可用于禁用错误处理例程。

语法

在错误 GoTo
On Error Resume Next
On Error GoTo 0

On Error 语句语法可具有以下任意形式:

语句 Description
在错误 GoTo 启用错误处理例程,该例程从所需参数中指定的开始。

line 参数是任何行标签行号

如果发生 运行时错误 ,控制分支到 ,使错误处理程序处于活动状态。

指定的 line 必须与 On Error 语句在同一个过程中;否则将出现编译时错误。
On Error Resume Next 指定发生运行时错误时,控件将紧跟在发生错误的语句后面的 语句 ,并继续执行。 在访问对象时,使用此形式而不是 On Error GoTo
On Error GoTo 0 禁用当前过程中的任何已启用的错误处理程序。

备注

如果您未使用 On Error 语句,则出现任何运行时错误都是致命的;也就是说,将显示错误消息并停止执行。

“启用的”错误处理程序是指由 On Error 语句打开的错误处理程序;“活动”错误处理程序是指处理错误的过程中启用的处理程序。 如果在错误处理程序处于活动状态时发生错误, (错误发生与 ResumeExit SubExit FunctionExit Property 语句) 之间发生错误,则当前过程的错误处理程序无法处理此错误。 控制权将返回给调用过程。

如果调用过程具有启用的错误处理程序,则将激活该处理程序来处理错误。 如果调用过程的错误处理程序也处于活动状态,则控制权将通过之前的调用过程传递回,直至找到一个已启用但未激活的错误处理程序。 如果未找到已启用但未激活的错误处理程序,则该错误在实际发生时将是致命的。

每当错误处理程序将控制权传递回调用过程时,此过程变为当前过程。 在任何过程中由错误处理程序处理错误后,在 Resume 语句指定的点处继续在当前过程中执行。

注意

错误处理例程不是 Sub 过程或 Function 过程。 它是由行标签或行号标记的代码部分。

错误处理例程依赖于 Err 对象的 Number 属性中的值来确定错误的原因。 在发生任何其他错误或调用可能导致错误的过程之前,错误处理例程应测试或保存 Err 对象中的相关属性值。 Err 对象中的属性值仅反映最新错误。 与 Err.Number 关联的错误消息包含在 Err.Description 中。

On Error Resume Next 导致继续执行紧跟导致运行时错误的语句的语句,或继续执行紧跟包含 On Error Resume Next 语句的过程外部的最新调用的语句。 此语句允许继续执行,而不管运行时错误。 您可以将错误处理例程置于发生错误的位置,而不是将控制权转移到程序中的其他位置。 当调用其他过程时,On Error Resume Next 语句将变为不活动状态,因此,如果您需要在该例程中进行内联错误处理,则应在每个调用的例程中执行 On Error Resume Next 语句。

注意

[!注释] 当处理在访问其他对象的过程中生成的错误时, On Error Resume Next 构造可能比 On Error GoTo 更可取。 通过在每次与对象进行交互后检查 Err 可消除有关此代码已访问的对象的歧义。 您可以确定在 Err.Number 中放置错误代码的对象,并确定最初生成错误的对象(Err.Source 中指定的对象)。

On Error GoTo 0 禁用当前过程中的错误处理。 它不将行 0 指定为错误处理代码的开始位置,即使此过程包含编号为 0 的行。 在不使用 On Error GoTo 0 语句的情况下,退出过程时将自动禁用错误处理程序。

若要在未发生错误时阻止运行错误处理代码,请在错误处理例程的前面放置 Exit SubExit FunctionExit Property 语句,如以下代码段所示:

Sub InitializeMatrix(Var1, Var2, Var3, Var4) 
 On Error GoTo ErrorHandler 
 . . . 
 Exit Sub 
ErrorHandler: 
 . . . 
 Resume Next 
End Sub

在这里,错误处理代码位于 Exit Sub 语句后面,并位于 End Sub 语句之前,以将其与过程流分开。 可以将错误处理代码置于过程中的任何位置。

当对象作为可执行文件运行时,对象中未捕获的错误将返回到控制应用程序。 在开发环境中,如果设置了适当的选项,则未捕获的错误仅返回到控制应用程序。 有关调试期间应设置哪些选项、如何设置这些选项以及主机是否能创建的说明,请参阅主机应用程序的文档。

如果您创建一个访问其他对象的对象,您应尝试处理从其传递回的未处理的错误。 如果您无法处理此类错误,请将 Err.Number 中的错误代码映射到您自己的某个错误,然后将其传递回对象的调用方。 您应通过将错误代码添加到 vbObjectError 常量来指定您的错误。 例如,如果您的错误代码为 1052,则按以下方式指定它:

Err.Number = vbObjectError + 1052 

注意

调用 Windows 动态链接库 时出现的系统错误 (DLL) 或 Macintosh 代码资源不会引发异常,并且无法通过 Visual Basic 错误捕获来捕获。 调用 DLL 函数时,应根据 API 规范) 检查每个返回值是否成功或失败 (,如果失败,请检查 Err 对象的 LastDLLError 属性中的值。 在 Macintosh 上,LastDLLError 始终返回 0。

示例

此示例首先使用 On Error GoTo 语句指定错误处理例程在过程中的位置。 在此示例中,尝试删除打开的文件会生成错误号 55。 在错误处理例程中处理此错误,然后控制权将返回导致此错误的语句。 On Error GoTo 0 语句关闭错误捕获。

然后,使用 On Error Resume Next 语句来延迟错误捕获,以便确定下一语句生成的错误的上下文。 请注意,Err.Clear 用于在处理错误后清除 Err 对象的属性。

Sub OnErrorStatementDemo() 
 On Error GoTo ErrorHandler ' Enable error-handling routine. 
 Open "TESTFILE" For Output As #1 ' Open file for output. 
 Kill "TESTFILE" ' Attempt to delete open 
 ' file. 
 On Error Goto 0 ' Turn off error trapping. 
 On Error Resume Next ' Defer error trapping. 
 ObjectRef = GetObject("MyWord.Basic") ' Try to start nonexistent 
 ' object, then test for 
'Check for likely Automation errors. 
 If Err.Number = 440 Or Err.Number = 432 Then 
 ' Tell user what happened. Then clear the Err object. 
 Msg = "There was an error attempting to open the Automation object!" 
 MsgBox Msg, , "Deferred Error Test" 
 Err.Clear ' Clear Err object fields 
 End If 
Exit Sub ' Exit to avoid handler. 
ErrorHandler: ' Error-handling routine. 
 Select Case Err.Number ' Evaluate error number. 
 Case 55 ' "File already open" error. 
 Close #1 ' Close open file. 
 Case Else 
 ' Handle other situations here... 
 End Select 
 Resume ' Resume execution at same line 
 ' that caused the error. 
End Sub

另请参阅

支持和反馈

有关于 Office VBA 或本文档的疑问或反馈? 请参阅 Office VBA 支持和反馈,获取有关如何接收支持和提供反馈的指南。