On Error-Anweisung (Visual Basic)

Aktiviert eine Fehlerbehandlungsroutine und gibt die Position der Routine innerhalb einer Prozedur an. Kann auch verwendet werden, um eine Fehlerbehandlungsroutine zu deaktivieren. Die On Error-Anweisung wird in der unstrukturierten Fehlerbehandlung verwendet und kann anstelle der strukturierten Ausnahmebehandlung verwendet werden. Die strukturierte Ausnahmebehandlung ist in .NET integriert. Sie ist im Allgemeinen effizienter und wird daher für die Behandlung von Laufzeitfehlern in Ihrer Anwendung empfohlen.

Ohne Fehler- oder Ausnahmebehandlung ist jeder auftretende Laufzeitfehler ein schwerwiegender Fehler: Es wird eine Fehlermeldung angezeigt, und die Ausführung wird abgebrochen.

Hinweis

Das Error-Schlüsselwort wird auch in der Error-Anweisung verwendet, die aus Gründen der Abwärtskompatibilität unterstützt wird.

Syntax

On Error { GoTo [ line | 0 | -1 ] | Resume Next }

Bestandteile

Begriff Definition
GoToline Aktiviert die Fehlerbehandlungsroutine, die mit der im erforderlichen Argument line angegebenen Zeile beginnt. Das line-Argument ist eine beliebige Zeilenbezeichnung oder Zeilennummer. Beim Auftreten eines Laufzeitfehlers verzweigt die Steuerung in die angegebene Zeile und aktiviert den Fehlerhandler. Die angegebene Zeile muss sich in derselben Prozedur befinden wie die On Error-Anweisung, andernfalls kommt es zu einem Kompilierzeitfehler.
GoTo 0 Deaktiviert den aktivierten Fehlerhandler in der aktuellen Prozedur und setzt ihn auf Nothing zurück.
GoTo -1 Deaktiviert die aktivierte Ausnahme in der aktuellen Prozedur und setzt sie auf Nothing zurück.
Resume Next Gibt an, dass die Steuerung bei einem Laufzeitfehler an die Anweisung übergeben wird, die unmittelbar auf die Anweisung folgt, an der der Fehler aufgetreten ist. Die Ausführung wird ab diesem Punkt fortgesetzt. Verwenden Sie dieses Formular anstelle von On Error GoTo, wenn Sie auf Objekte zugreifen.

Bemerkungen

Hinweis

Es wird empfohlen, in Ihrem Code nach Möglichkeit eine strukturierte Ausnahmebehandlung durchzuführen, anstatt eine unstrukturierte Ausnahmebehandlung und die On Error-Anweisung zu verwenden. Weitere Informationen finden Sie unter Try...Catch...Finally-Anweisung.

Ein Fehlerhandler ist „betriebsbereit“, wenn er durch eine On Error-Anweisung aktiviert wurde. Ein „aktiver“ Fehlerhandler ist ein betriebsbereiter Handler, der zurzeit eine Fehlerbehandlung durchführt.

Wenn ein Fehler auftritt, während ein Fehlerhandler aktiv ist (zwischen dem Auftreten des Fehlers und einer Resume-, Exit Sub-, Exit Function- oder Exit Property-Anweisung), kann der Fehlerhandler der aktuellen Prozedur den Fehler nicht behandeln. Die Steuerung wird an die aufrufende Prozedur zurückgegeben.

Wenn die aufrufende Prozedur über einen betriebsbereiten Fehlerhandler verfügt, wird dieser aktiviert, um den Fehler zu behandeln. Wenn der Fehlerbehandler der aufrufenden Prozedur ebenfalls aktiv ist, wird die Steuerung durch die vorherigen aufrufenden Prozeduren zurückgegeben, bis ein betriebsbereiter, aber inaktiver Fehlerbehandler gefunden wird. Wenn kein solcher Fehlerhandler gefunden wird, ist der Fehler an dem Punkt schwerwiegend, an dem er aufgetreten ist.

Jedes Mal, wenn der Fehlerbehandler die Steuerung an eine aufrufende Prozedur zurückgibt, wird diese Prozedur zur aktuellen Prozedur. Sobald ein Fehler in einer beliebigen Prozedur durch einen Fehlerhandler behandelt wurde, wird die Ausführung in der aktuellen Prozedur an der Stelle fortgesetzt, die durch die Anweisung Resume angegeben ist.

Hinweis

Eine Fehlerbehandlungsroutine ist keine Sub- oder Function-Prozedur. Es handelt sich um einen Codeabschnitt, der durch eine Zeilenbezeichnung oder eine Zeilennummer gekennzeichnet ist.

Number-Eigenschaft

Fehlerbehandlungsroutinen stützen sich auf den Wert in der Number-Eigenschaft des Err-Objekts, um die Ursache des Fehlers zu ermitteln. Die Routine sollte die relevanten Eigenschaftswerte im Err-Objekt testen oder speichern, bevor ein anderer Fehler auftreten kann oder bevor eine Prozedur aufgerufen wird, die einen Fehler verursachen könnte. Die Eigenschaftswerte im Objekt Err spiegeln nur den letzten Fehler wider. Die mit Err.Number verbundene Fehlermeldung ist in Err.Description enthalten.

Throw-Anweisung

Ein Fehler, der mit der Methode Err.Raise ausgelöst wird, legt die Eigenschaft Exception auf eine neu erstellte Instanz der Klasse Exception fest. Um Ausnahmen von abgeleiteten Ausnahmetypen auslösen zu können, wird in der Sprache eine Throw-Anweisung unterstützt. Diese Funktion akzeptiert einen einzelnen Parameter, der die auszulösende Ausnahme repräsentiert. Das folgende Beispiel zeigt, wie diese Features mit der vorhandenen Unterstützung für die Ausnahmebehandlung genutzt werden können:

    On Error GoTo Handler
    Throw New DivideByZeroException()
Handler:
    If (TypeOf Err.GetException() Is DivideByZeroException) Then
    ' Code for handling the error is entered here.
    End If

Beachten Sie, dass die On Error GoTo-Anweisung alle Fehler abfängt, unabhängig von der Ausnahmeklasse.

„On Error Resume Next“

On Error Resume Next bewirkt, dass die Ausführung mit der Anweisung fortgesetzt wird, die unmittelbar auf die den Laufzeitfehler verursachende Anweisung folgt, oder mit der Anweisung, die unmittelbar auf den letzten Aufruf der Prozedur folgt, die die Anweisung On Error Resume Next enthält. Diese Anweisung ermöglicht die Fortsetzung der Ausführung trotz eines Laufzeitfehlers. Sie können die Fehlerbehandlungsroutine dort platzieren, wo der Fehler auftreten würde, anstatt die Steuerung an eine andere Stelle innerhalb der Prozedur zu übergeben. Eine On Error Resume Next-Anweisung wird inaktiv, wenn eine andere Prozedur aufgerufen wird. Sie sollten also in jeder aufgerufenen Routine eine On Error Resume Next-Anweisung ausführen, wenn Sie eine Inline-Fehlerbehandlung innerhalb dieser Routine durchführen möchten.

Hinweis

Das On Error Resume Next-Konstrukt kann bei der Behandlung von Fehlern, die beim Zugriff auf andere Objekte auftreten, gegenüber On Error GoTo vorzuziehen sein. Durch die Überprüfung von Err nach jeder Interaktion mit einem Objekt werden Unklarheiten darüber beseitigt, auf welches Objekt der Code zugegriffen hat. Sie können sicher sein, welches Objekt den Fehlercode in Err.Number platziert hat, sowie welches Objekt den Fehler ursprünglich generiert hat (das in Err.Source angegebene Objekt).

„On Error GoTo 0“

On Error GoTo 0 deaktiviert die Fehlerbehandlung in der aktuellen Prozedur. Es wird nicht Zeile 0 als Beginn des Fehlerbehandlungscodes angegeben, selbst wenn die Prozedur eine Zeile mit der Nummer 0 enthält. Ohne eine On Error GoTo 0-Anweisung wird ein Fehlerhandler automatisch deaktiviert, wenn eine Prozedur beendet wird.

„On Error GoTo -1“

On Error GoTo -1 deaktiviert die Ausnahme in der aktuellen Prozedur. Es wird nicht Zeile 1 als Beginn des Fehlerbehandlungscodes angegeben, selbst wenn die Prozedur eine Zeile mit der Nummer 1 enthält. Ohne eine On Error GoTo -1-Anweisung wird eine Ausnahme automatisch deaktiviert, wenn eine Prozedur beendet wird.

Um die Ausführung von Fehlerbehandlungscode zu verhindern, wenn kein Fehler aufgetreten ist, platzieren Sie eine Exit Sub-, Exit Function- oder Exit Property-Anweisung unmittelbar vor der Fehlerbehandlungsroutine, wie im folgenden Fragment gezeigt:

Public Sub InitializeMatrix(ByVal Var1 As Object, ByVal Var2 As Object)
   On Error GoTo ErrorHandler
   ' Insert code that might generate an error here
   Exit Sub
ErrorHandler:
   ' Insert code to handle the error here
   Resume Next
End Sub

Hier folgt der Fehlerbehandlungscode auf die Exit Sub-Anweisung und steht vor der End Sub-Anweisung, um ihn vom Prozedurablauf zu trennen. Sie können den Fehlerbehandlungscode an beliebiger Stelle in einer Prozedur platzieren.

Nicht abgefangene Fehler

Nicht abgefangene Fehler in Objekten werden an die steuernde Anwendung zurückgegeben, wenn das Objekt als ausführbare Datei ausgeführt wird. Innerhalb der Entwicklungsumgebung werden nicht abgefangene Fehler nur dann an die steuernde Anwendung zurückgegeben, wenn die richtigen Optionen festgelegt sind. In der Dokumentation Ihrer Hostanwendung finden Sie eine Beschreibung, welche Optionen während des Debuggens festgelegt werden sollten, wie Sie diese festlegen und ob der Host Klassen erstellen kann.

Wenn Sie ein Objekt erstellen, das auf andere Objekte zugreift, sollten Sie nach Möglichkeit alle unbehandelten Fehler behandeln, die diese zurückgeben. Wenn dies nicht möglich ist, ordnen Sie die Fehlercodes in Err.Number einem Ihrer eigenen Fehler zu, und geben Sie sie dann an den Aufrufer Ihres Objekts zurück. Sie sollten Ihren Fehler angeben, indem Sie Ihren Fehlercode zur Konstante VbObjectError hinzufügen. Wenn Ihr Fehlercode z. B. 1052 lautet, weisen Sie ihn wie folgt zu:

Err.Number = vbObjectError + 1052

Achtung

Systemfehler beim Aufruf von Windows-DLLs (Dynamic Link Library) lösen keine Ausnahmen aus und können nicht mit der Visual Basic-Fehlerbehebung abgefangen werden. Wenn Sie DLL-Funktionen aufrufen, sollten Sie jeden Rückgabewert (gemäß den API-Spezifikationen) auf Erfolg oder Fehler prüfen und im Falle eines Fehlers den Wert in der LastDLLError-Eigenschaft des Err-Objekts überprüfen.

Beispiel

In diesem Beispiel wird zunächst die On Error GoTo-Anweisung verwendet, um die Position einer Fehlerbehandlungsroutine innerhalb einer Prozedur anzugeben. Im Beispiel führt der Versuch einer Division durch 0 zu Fehler Nummer 6. Der Fehler wird in der Fehlerbehandlungsroutine behandelt, und anschließend wird die Steuerung an die Anweisung zurückgegeben, die den Fehler verursacht hat. Die Anweisung On Error GoTo 0 deaktiviert die Fehlerbehebung. Anschließend wird die Fehlerbehebung mithilfe der On Error Resume Next-Anweisung zurückgestellt, damit der Kontext für den von der nächsten Anweisung generierten Fehler mit Sicherheit bekannt ist. Beachten Sie, dass Err.Clear verwendet wird, um die Eigenschaften des Err-Objekts zu löschen, nachdem der Fehler behandelt wurde.

Public Sub OnErrorDemo()
   On Error GoTo ErrorHandler   ' Enable error-handling routine.
   Dim x As Integer = 32
   Dim y As Integer = 0
   Dim z As Integer
   z = x / y   ' Creates a divide by zero error
   On Error GoTo 0   ' Turn off error trapping.
   On Error Resume Next   ' Defer error trapping.
   z = x / y   ' Creates a divide by zero error again
   If Err.Number = 6 Then
      ' Tell user what happened. Then clear the Err object.
      Dim Msg As String
      Msg = "There was an error attempting to divide by zero!"
      MsgBox(Msg, , "Divide by zero error")
      Err.Clear() ' Clear Err object fields.
   End If
Exit Sub      ' Exit to avoid handler.
ErrorHandler:  ' Error-handling routine.
   Select Case Err.Number   ' Evaluate error number.
      Case 6   ' Divide by zero error
         MsgBox("You attempted to divide by zero!")
         ' Insert code to handle this error
      Case Else
         ' Insert code to handle other situations here...
   End Select
   Resume Next  ' Resume execution at the statement immediately 
                ' following the statement where the error occurred.
End Sub

Anforderungen

Namespace:Microsoft.VisualBasic

Assembly: Visual Basic-Laufzeitbibliothek (in „Microsoft.VisualBasic.dll“)

Siehe auch