webentwicklung-frage-antwort-db.com.de

Unterschied zwischen 'on error goto 0' und 'on error goto -1' - VBA

Kann irgendjemand den Unterschied zwischen 'Bei Fehler gehe zu -1' und 'Bei Fehler gehe zu 0' in VBA finden? Ich habe versucht, Google und MSDN, aber ich hatte kein Glück.

39
sterlingalston

On Error GoTo 0 deaktiviert alle derzeit in der Prozedur vorhandenen Fehlerbehebungen.

On Error GoTo -1 löscht die Fehlerbehandlung und setzt sie auf nichts, wodurch Sie eine weitere Fehlerfalle erstellen können.

Beispiel: On Error GoTo -1

Nachdem der erste Fehler ausgelöst wurde, wird GoTo ErrorFound, das dann die Fehlerbehandlung der Routine löscht und eine neue einstellt, die GoTo AnotherErrorFound wenn ein Fehler gefunden wird.

Sub OnErrorGotoMinusOneTest()

    On Error GoTo ErrorFound

    Err.Raise Number:=9999, Description:="Forced Error"

    Exit Sub

ErrorFound:

    On Error GoTo -1 'Clear the current error handling
    On Error GoTo AnotherErrorFound 'Set a new one
    Err.Raise Number:=10000, Description:="Another Forced Error"

AnotherErrorFound:

    'Code here

End Sub

Beispiel: On Error GoTo

Nachdem der erste Fehler aufgetreten ist, erhalten Sie den Fehler, da die Fehlerbehandlung deaktiviert wurde.

Sub OnErrorGotoZeroTest()

    On Error GoTo 0

    Err.Raise Number:=9999, Description:="Forced Error"

End Sub
56
Francis Dean

Diese Antwort behebt die Verwechslung zwischen dem Fehlerobjekt und dem Fehlerbehandler.

Das Fehlerobjekt kann mit Err.Clear Gelöscht werden. Dies hat keine Auswirkungen auf den Fehlerbehandler.

Der Fehlerbehandler wird mit On Error Goto <label> Aktiviert. Es wird aktiv, wenn ein Fehler auftritt.

Während der Fehlerbehandler aktiv ist , können Sie keinen neuen Fehlerbehandler zuweisen. On Error Goto <label> Hat keine Auswirkung. VBA ignoriert einfach den Versuch, einen neuen Fehlerbehandler zuzuweisen.

Mit Err.Clear Wird die Fehlerbehandlung nicht abgebrochen.

Wenn Sie mit Goto <label> An eine andere Stelle im Code springen, wird die Fehlerbehandlung nicht abgebrochen. Die Verwendung von Goto <label> In einem Fehlerbehandlungsblock kann Verwirrung stiften und sollte vermieden werden. Möglicherweise ist der Fehlerbehandler nicht mehr aktiv, obwohl er noch aktiv ist.

Ein aktiver Fehlerbehandler bewirkt, dass Sie keinen neuen Fehlerbehandler zuweisen können. On Error Goto <label> Hat keine Auswirkung. VBA ignoriert einfach den Versuch, einen neuen Fehlerbehandler zuzuweisen. Alle zusätzlichen Fehler werden nicht behandelt, solange der Fehlerbehandler aktiv ist.

Die einzige Möglichkeit, einen aktiven Fehlerbehandler zu beenden, ist:

  1. Resume
  2. Resume Next
  3. Resume <label>
  4. On error goto -1
  5. verlassen Sie die Prozedur

Durch Verwenden einer dieser Methoden zum Beenden des Fehlerhandlers wird auch das Fehlerobjekt gelöscht.

Hervorragende Quelle: Pearson-Fehlerbehandlung in VBA Chip Pearson erwähnt On error goto -1 In seinem Artikel nicht. Um ihn zu zitieren:

Ich habe absichtlich On Error GoTo-1 nicht eingefügt, da es keinem wirklichen Zweck dient und die gesamte Excel-Anwendung sperren kann, sofern es nicht genau richtig verwendet wird. Ja, On Error GoTo -1 ist syntaktisch gültig, aber es ist, als würde man einem betrunkenen Teenager eine Waffe geben. Nichts Gutes wird daraus entstehen.

Sie können Fehler auch inline behandeln, ohne einen Fehlerbehandler mit dem Fehlerobjekt zu verwenden: MSDN Inline Error Handling

14
D_Bester