错误处理块中的Resume和Goto之间的区别

时间:2010-06-08 11:01:15

标签: vb6 error-handling

据我所知,在以下示例中,应使用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

我的问题是两者的执行有什么不同?

2 个答案:

答案 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"