2010-06-08 83 views
13

我知道在下面的例子中应该使用Resume语句来代替Goto语句。错误处理模块中的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 

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

回答

21

两者都执行到Cleanup标签。至于我记得,唯一的区别是

  • 使用Goto不清除Err对象,这会使你的错误处理程序禁用(所以如果你使用GotoErr.Clear是必要的)。如果在Cleanup标签后发生错误,则不会在ErrorHandler处理。
  • 使用Resume清除Err对象,它将您的错误处理程序重新打开(它在处理错误时被禁用)。如果Cleanup拉布勒后发生错误,它会在ErroHandler

的VB6 manual entry for the Resume statement处理并不能解释这些差异。

+0

干杯MarkJ,从这个答案中学到很多东西。 – 2010-06-08 11:19:22

+1

虽然测试我发现,如果在清理中出现错误,将会在ErrorHandler和CleanUp块之间弹跳一个infinte循环。 因此推荐的技术是在CleanUp中具有On Error Resume Next? – 2010-06-08 13:55:43

+0

@ Rich Oliver是的,这就是我所做的。看看这个问题http://stackoverflow.com/questions/536379/how-do-you-handle-errors-in-error-handlers-in-vb6甚至有一个看看标签'vb6'和'错误处理'http://stackoverflow.com/questions/tagged?tagnames=vb6%2berror-handling&sort=votes&pagesize=15 – MarkJ 2010-06-08 16:20:03

2

这是很大的误解! 有之间重要的不同:

Err.Clear 
GoTo CleanUp 

和:

Resume CleanUp 

NEVER使用第一形式中,始终使用恢复清理(只)。 继续执行内部VB6错误状态的RESET,所以当发生OTHER错误时,将应用“On Error GoTo Label”。我使用“Err.Clear”Err对象被清除,但内部错误状态不被清除,并且当另一个错误发生时,它被认为是代码没有任何异常处理程序并抛出函数外。您无法使用修复它“对错误转到Label2的”

考虑以下代码:“ERROR”

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”,则执行不会在“错误!”中中断。行和代码跳转到“L2”标签并提供“MsgBox Err”

相关问题