On Error
启用错误处理例程并指定该例程在过程中的位置;也可用于禁用错误处理例程。
语法:
On Error GoTo line
On Error Resume Next
On Error GoTo 0
- On Error GoTo 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语句指定的位置继续。
错误处理例程依赖Err对象的Number属性值来确定错误原因。在发生任何其他错误或调用可能产生错误的过程之前,错误处理例程应测试或保存Err对象中的相关属性值。Err对象中的属性值仅反映最近一次错误。与Err.Number关联的错误消息包含在Err.Description中。
On Error Resume Next使执行继续到导致运行时错误的语句之后紧接着的语句,或继续到从包含On Error Resume Next语句的过程最近一次调用之后的语句。此语句允许在运行时错误发生时继续执行。错误处理例程可以放在错误可能发生的位置,而不是将控制转移到过程内的其他位置。On Error Resume Next语句在调用其他过程时变为非活动状态,因此必须在需要内联错误处理的每个被调用例程中执行On Error Resume Next语句。
INFO
在处理访问其他对象时产生的错误时,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 + 1052INFO
调用Windows动态链接库(DLL)时的系统错误不会引发异常,也无法用twinBASIC的错误捕获机制捕获。调用DLL函数时,应根据API规范检查每个返回值的成功或失败,如果失败,则检查Err对象的LastDLLError属性值。
示例
本示例首先使用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.
' 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