2010-06-08 11 views
13

Rozumiem, że w poniższym przykładzie zamiast instrukcji Goto należy użyć instrukcji Wznów.Różnica między Wznówem i Odwołaniem w bloku obsługi błędów

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 

Moje pytanie brzmi, jaka jest różnica w wykonaniu dwóch?

Odpowiedz

21

Obie operacje przesyłania do etykiety Cleanup. O ile pamiętam, jedyne różnice to

  • Korzystanie Goto nie wyczyścić obiektu Err (tak Err.Clear jest konieczne, jeśli używasz Goto) i pozostawia obsługi błędów wyłączona. Jeśli wystąpi błąd po etykiecie Cleanup, nie będzie on obsługiwany pod adresem ErrorHandler.
  • Użycie Resume usuwa obiekt Err i ponownie włącza obsługę błędu (jest wyłączony podczas obsługi błędów). W przypadku wystąpienia błędu po Cleanup label, będzie obsługiwane w ErroHandler

VB6 manual entry for the Resume statement nie wyjaśnia te różnice.

+0

Pozdrowienia od MarkJ, wiele się z tej odpowiedzi nie uczymy. –

+1

Podczas testów odkryłem, że jeśli błąd zostanie zgłoszony w CleanUp, pętla infinte będzie istniała podskakując między blokami ErrorHandler i CleanUp. Czy zalecana technika ma mieć opcję Wznów błąd przy następnym czyszczeniu? –

+0

@Rich Oliver Tak, właśnie to robię. Sprawdź to pytanie http://stackoverflow.com/questions/536379/how-do-you-handle-errors-in-error-handlers-in-vb6 lub nawet przejrzyj inne pytania oznaczone tagami 'vb6' i' obsługa błędów: http://stackoverflow.com/questions/tagged?tagnames=vb6%2berror-handling&sort=votes&pagesize=15 – MarkJ

2

To WIELKIE nieporozumienie! Istnieje ważna różnica pomiędzy:

Err.Clear 
GoTo CleanUp 

a:

Resume CleanUp 

nigdy nie używać pierwszej formy, należy zawsze skrócie czyszczenia (tylko). Wznów, wykonaj RESET wewnętrznego błędu VB6, więc gdy pojawi się INNY błąd, zostanie zastosowana "On Error GoTo Label". Używam "Err.Clear", a następnie obiekt Err zostanie wyczyszczony, ale stan błędu WEWNĘTRZNEGO NIE zostanie wyczyszczony, a gdy pojawi się inny błąd, jest on traktowany jako kod BEZ dowolnego programu obsługi wyjątku i wyrzuca go poza funkcję. Nie można naprawić za pomocą „On Error GoTo Label2”

Rozważmy następujący kod: „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 

Jeśli uruchomić to będzie przerwać na linia. Po zamianie "Err.Clear" na "Resume L0", wykonanie nie przerywa w "ERROR!" linia i kod przeskakują do etykiety "L2" i dostarczają "MsgBox Err"