在错误 GoTo
行
上
启用错误处理例程,该例程从所需
行
参数
中指定的
行
开始。
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.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 Sub
、
Exit Function
或
Exit 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 支持和反馈,获取有关如何接收支持和提供反馈的指南。