【问题标题】:Difference between Resume and Goto in error handling block错误处理块中 Resume 和 Goto 之间的区别
【发布时间】:2016-05-10 21:15:17
【问题描述】:

我了解在以下示例中应使用 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

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

【问题讨论】:

    标签: vb6 error-handling


    【解决方案1】:

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

    • 使用Goto 不会清除Err 对象(所以如果使用GotoErr.Clear 是必需的)并且它会禁用错误处理程序。如果在Cleanup 标签之后出现错误,则不会在ErrorHandler 处理。
    • 使用Resume 会清除Err 对象并重新打开错误处理程序(在处理错误时它被禁用)。如果Cleanup标签后出现错误,将在ErroHandler处理

    VB6 manual entry for the Resume statement 没有解释这些差异。

    【讨论】:

    • 在测试时我发现如果在 CleanUp 中引发错误,则会在 ErrorHandler 和 CleanUp 块之间存在无限循环。因此,推荐的技术是在 CleanUp 中设置 On Error Resume Next 吗?
    • @Rich Oliver 是的,我就是这么做的。看看这个问题stackoverflow.com/questions/536379/…,甚至看看标记为vb6error-handlingstackoverflow.com/questions/…的其他问题
    【解决方案2】:

    这是一个很大的误解! 两者之间有重要的区别:

    Err.Clear
    GoTo CleanUp
    

    和:

    Resume CleanUp
    

    永远不要使用第一种形式,始终使用 Resume CleanUp(仅)。 恢复做内部 VB6 错误状态的 RESET,所以当发生 OTHER 错误时,将应用“On Error GoTo Label”。我使用“Err.Clear”,然后清除 Err 对象,但未清除内部错误状态,当发生另一个错误时,它被视为没有任何异常处理程序的代码并抛出函数之外。您无法使用“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”替换为“Resume L0”,则执行不会因“ERROR!”而中断行和代码跳转到“L2”标签并提供“MsgBox Err”

    【讨论】:

      猜你喜欢
      • 2010-12-15
      • 2018-07-26
      • 2012-12-18
      • 2017-01-29
      • 2016-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-16
      相关资源
      最近更新 更多