据我所知,在以下示例中,应使用Resume语句而不是Goto语句。
Sub Method()
On Error Goto ErrorHandler
...
CleanUp:
...
Exit Function
ErrorHandler:
Log error etc
Err.Clear 'Is this line actually necessary?'
Resume CleanUp 'SHOULD USE THIS'
Goto CleanUp 'SHOULD NOT USE THIS'
End Sub
我的问题是两者的执行有什么不同?
答案 0 :(得分:22)
两者都将执行转移到Cleanup
标签。据我所知,唯一的区别是
Goto
不会清除Err对象(因此如果使用Err.Clear
,则Goto
是必需的)并且它会使您的错误处理程序被禁用。如果Cleanup
标签后发生错误,则不会在ErrorHandler
处理。 Resume
清除Err对象并重新打开错误处理程序(在处理错误时禁用它)。如果在Cleanup
标签后发生错误,则会在ErroHandler
VB6 manual entry for the Resume statement没有解释这些差异。
答案 1 :(得分:2)
这是一个很大的误解! 以下是重要的差异:
Err.Clear
GoTo CleanUp
和
Resume CleanUp
永远不要使用第一个表单,总是使用Resume CleanUp(仅限)。 继续执行内部VB6错误状态的RESET,因此当发生OTHER错误时," On Error GoTo Label"将适用。我使用" Err.Clear"然后清除Err对象,但不清除INTERNAL错误状态,当发生另一个错误时,它被视为没有任何异常处理程序的代码,并抛出函数外部。您无法通过使用" On Error GoTo Label2"
来解决此问题考虑以下代码:
Public Sub Test()
On Error GoTo L1
MsgBox 0 / (1 - 1)
Exit Sub
L1:
Err.Clear
L0:
On Error GoTo L2
MsgBox 0 / (1 - 1) 'ERROR!
Exit Sub
L2:
MsgBox Err
End Sub
如果你运行它,它会中断"错误!"线。 如果你更换" Err.Clear"用"恢复L0"然后执行不会中断" ERROR!"行和代码跳转到" L2"标签并提供" MsgBox Err"