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

Ric*_*ver 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
Run Code Online (Sandbox Code Playgroud)

我的问题是两者的执行有什么区别?

Mar*_*rkJ 23

两者都将执行转移到Cleanup标签.据我所知,唯一的区别是

  • 使用Goto不会清除Err对象(Err.Clear如果使用则必须这样做Goto)并且它会使您的错误处理程序被禁用.如果Cleanup标签后发生错误,则不会处理ErrorHandler.
  • 使用Resume清除Err对象并重新打开错误处理程序(它在处理错误时被禁用).如果在Cleanup标签之后发生错误,则将在以下处理ErroHandler

Resume语句的VB6 手动条目不解释这些差异.

  • 在测试时,我发现如果 CleanUp 中出现错误,则 ErrorHandler 和 CleanUp 块之间将存在无限循环。因此,推荐的技术是否是在清理中进行“错误时继续下一步”? (2认同)