2010-06-08 4 views
13

Ich verstehe, dass im folgenden Beispiel eine Resume-Anweisung anstelle einer Goto-Anweisung verwendet werden sollte.Unterschied zwischen Resume und Goto in Fehlerbehandlung Block

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 

Meine Frage ist, welchen Unterschied gibt es in der Ausführung der beiden?

Antwort

21

Beide übertragen Ausführung auf die Cleanup Bezeichnung. Soweit ich mich erinnern kann, die einzigen Unterschiede sind

  • Goto Verwendung nicht das Err-Objekt löschen (so Err.Clear ist notwendig, wenn Sie Goto verwenden) und es lässt Ihre Fehlerbehandlung deaktiviert. Wenn nach dem Zeichen Cleanup ein Fehler auftritt, wird dieser nicht unter ErrorHandler behandelt.
  • Die Verwendung von Resume löscht das Err-Objekt und es schaltet Ihre Fehlerbehandlung wieder ein (es ist deaktiviert, während es Fehler behandelt). Wenn ein Fehler nach dem Label Cleanup auftritt, wird es bei ErroHandler

Die VB6 manual entry for the Resume statement erklärt nicht, diese Unterschiede behandelt werden.

+0

Prost MarkJ, lerne nicht viel von dieser Antwort. –

+1

Während des Tests habe ich festgestellt, dass, wenn ein Fehler in CleanUp ausgelöst wird, eine Infinte-Schleife zwischen den ErrorHandler- und CleanUp-Blöcken auftritt. Ist die empfohlene Technik daher On Error Resume Next im CleanUp? –

+0

@Rich Oliver Ja, das mache ich. Sehen Sie sich diese Frage http://stackoverflow.com/questions/536379/how-do-you-handle-errors-in-error-handlers-in-vb6 an oder werfen Sie einen Blick auf die anderen mit 'vb6' und' gekennzeichneten Fragen Fehlerbehandlung "http://stackoverflow.com/questions/tagged?tagnames=vb6%2berror-handling&sort=votes&pagesize=15 – MarkJ

2

Das ist großes Missverständnis! Es ist wichtiger Unterschied zwischen:

Err.Clear 
GoTo CleanUp 

und:

Resume CleanUp 

NIEMALS das erste Formular verwenden, IMMER Lebenslauf CleanUp verwenden (nur). Setzen Sie den RESET des internen VB6-Fehlerzustands fort. Wenn also ein anderer Fehler auftritt, wird "On Error GoTo Label" angewendet. Wenn Sie "Err.Clear" verwenden, wird das Err-Objekt gelöscht, aber der INTERNE Fehlerstatus wird NICHT gelöscht, und wenn ein anderer Fehler auftritt, wird er als OHNE einen Ausnahme-Handler betrachtet und außerhalb der Funktion ausgegeben. Sie können es nicht beheben, indem Sie "On Error GoTo Label2"

Betrachten Sie diesen Code: "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 

Wenn Sie dies ausführen, wird es auf unterbrechen Linie. Wenn Sie "Err.Clear" durch "Resume L0" ersetzen, wird die Ausführung bei "ERROR!" Nicht unterbrochen. Zeile und Code springt auf "L2" Label und liefert "MsgBox Err"