On Error-Anweisung (Visual Basic)

Aktiviert eine Fehlerbehandlungsroutine und gibt den Speicherort 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, ist im Allgemeinen effizienter und wird daher bei der Behandlung von Laufzeitfehlern in Ihrer Anwendung empfohlen.

Ohne Fehlerbehandlung oder Ausnahmebehandlung ist jeder aufgetretene Laufzeitfehler schwerwiegend: Es wird eine Fehlermeldung angezeigt, und die Ausführung wird beendet.

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
GoToLinie Aktiviert die Fehlerbehandlungsroutine, die an der im erforderlichen Zeilenargument angegebenen Zeile beginnt. Das Line-Argument ist eine beliebige Zeilenbezeichnung oder Zeilennummer. Wenn ein Laufzeitfehler auftritt, verzweigt die Steuerung die angegebene Zeile, sodass der Fehlerhandler aktiv wird. Die angegebene Zeile muss sich in derselben Prozedur wie die On Error -Anweisung befinden, andernfalls tritt ein Kompilierzeitfehler auf.
GoTo 0 Deaktiviert den aktivierten Fehlerhandler in der aktuellen Prozedur und setzt ihn auf zurück Nothing.
GoTo -1 Deaktiviert die aktivierte Ausnahme in der aktuellen Prozedur und setzt sie auf zurück Nothing.
Resume Next Gibt an, dass, wenn ein Laufzeitfehler auftritt, die Steuerung zu der Anweisung wechselt, die unmittelbar auf die Anweisung folgt, in der der Fehler aufgetreten ist, und die Ausführung ab diesem Punkt fortgesetzt wird. Verwenden Sie dieses Formular anstelle On Error GoTo des Zugriffs auf Objekte.

Bemerkungen

Hinweis

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

Ein "aktivierter" Fehlerhandler ist ein Fehlerhandler, der von einer On Error -Anweisung aktiviert wird. Ein "aktiver" Fehlerhandler ist ein aktivierter Handler, der gerade einen Fehler behandelt.

Wenn ein Fehler auftritt, während ein Fehlerhandler aktiv ist (zwischen dem Auftreten des Fehlers und einer Resume, Exit Sub, Exit Functionoder Exit Property -Anweisung), kann der Fehlerhandler der aktuellen Prozedur den Fehler nicht behandeln. Das Steuerelement kehrt zur aufrufenden Prozedur zurück.

Wenn die aufrufende Prozedur über einen aktivierten Fehlerhandler verfügt, wird sie aktiviert, um den Fehler zu behandeln. Wenn der Fehlerhandler der aufrufenden Prozedur ebenfalls aktiv ist, durchläuft die Steuerung vorherige aufrufende Prozeduren, bis ein aktivierter, aber inaktiver Fehlerhandler gefunden wird. Wenn kein solcher Fehlerhandler gefunden wird, ist der Fehler an dem Zeitpunkt, an dem er tatsächlich aufgetreten ist, schwerwiegend.

Jedes Mal, wenn der Fehlerhandler die Steuerung an eine aufrufende Prozedur zurückgibt, wird diese Prozedur zur aktuellen Prozedur. Sobald ein Fehler von einem Fehlerhandler in einer beliebigen Prozedur behandelt wurde, wird die Ausführung in der aktuellen Prozedur an dem punkt fortgesetzt, der von der Resume -Anweisung festgelegt wurde.

Hinweis

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

Number-Eigenschaft

Fehlerbehandlungsroutinen basieren auf dem Wert in der Number -Eigenschaft des Err Objekts, um die Fehlerursache zu bestimmen. Die Routine sollte relevante 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 Err -Objekt spiegeln nur den letzten Fehler wider. Die zugeordnete Err.Number Fehlermeldung ist in Err.Descriptionenthalten.

Throw-Anweisung

Ein Fehler, der mit der Err.Raise -Methode ausgelöst wird, legt die Exception -Eigenschaft auf eine neu erstellte Instanz der Exception -Klasse fest. Um das Auslösen von Ausnahmen von abgeleiteten Ausnahmetypen zu unterstützen, wird eine Throw -Anweisung in der Sprache unterstützt. Hierfür wird ein einzelner Parameter verwendet, bei dem es sich um die ausnahmeinstanz handelt, die ausgelöst werden soll. Das folgende Beispiel zeigt, wie diese Features mit der vorhandenen Ausnahmebehandlungsunterstützung verwendet 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 abfangen kann, unabhängig von der Ausnahmeklasse.

On Error Resume Next

On Error Resume Next bewirkt, dass die Ausführung mit der Anweisung unmittelbar nach der Anweisung fortgesetzt wird, die den Laufzeitfehler verursacht hat, oder mit der Anweisung, die unmittelbar auf den letzten Aufruf der Prozedur folgt, die die On Error Resume Next Anweisung enthält. Mit dieser Anweisung kann die Ausführung trotz eines Laufzeitfehlers fortgesetzt werden. Sie können die Fehlerbehandlungsroutine an der Stelle platzieren, an der der Fehler auftritt, anstatt die Steuerung an einen anderen Speicherort innerhalb der Prozedur zu übertragen. Eine On Error Resume Next Anweisung wird inaktiv, wenn eine andere Prozedur aufgerufen wird. Daher sollten Sie eine On Error Resume Next Anweisung in jeder aufgerufenen Routine ausführen, wenn Sie in dieser Routine eine Inlinefehlerbehandlung wünschen.

Hinweis

Das On Error Resume Next -Konstrukt ist möglicherweise besser als bei der Behandlung von Fehlern, die On Error GoTo beim Zugriff auf andere Objekte generiert werden. Die Überprüfung Err nach jeder Interaktion mit einem Objekt entfernt Mehrdeutigkeiten darüber, auf welches Objekt der Code zugreift. Sie können sicher sein, welches Objekt den Fehlercode in Err.Numberplatziert hat und welches Objekt den Fehler ursprünglich generiert hat (das in Err.Sourceangegebene Objekt).

Bei Fehler GoTo 0

On Error GoTo 0 deaktiviert die Fehlerbehandlung in der aktuellen Prozedur. Zeile 0 wird nicht als Anfang des Fehlerbehandlungscodes angegeben, auch 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.

Bei Fehler GoTo -1

On Error GoTo -1 deaktiviert die Ausnahme in der aktuellen Prozedur. Zeile -1 wird nicht als Anfang des Fehlerbehandlungscodes angegeben, auch 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 zu verhindern, dass Fehlerbehandlungscode ausgeführt wird, wenn kein Fehler aufgetreten ist, platzieren Sie eine Exit Sub- , Exit Function- oder Exit Property -Anweisung unmittelbar vor der Fehlerbehandlungsroutine, wie im folgenden Fragment dargestellt:

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 der Exit Sub -Anweisung und geht der End Sub -Anweisung voran, um sie vom Prozedurflow zu trennen. Sie können Fehlerbehandlungscode an einer beliebigen 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 sollen, wie sie festgelegt werden und ob der Host Klassen erstellen kann.

Wenn Sie ein Objekt erstellen, das auf andere Objekte zugreift, sollten Sie versuchen, alle nicht behandelten Fehler zu behandeln, die von ihnen zurückgegeben werden. Wenn sie dies nicht können, ordnen Sie die Fehlercodes Err.Number einem Ihrer eigenen Fehler zu, und übergeben Sie sie dann zurück an den Aufrufer Ihres Objekts. Sie sollten Ihren Fehler angeben, indem Sie den Fehlercode zur Konstanten VbObjectError hinzufügen. Wenn Ihr Fehlercode beispielsweise 1052 ist, weisen Sie ihn wie folgt zu:

Err.Number = vbObjectError + 1052

Achtung

Systemfehler bei Aufrufen von Windows-DLLs (Dynamic Link Libraries) lösen keine Ausnahmen aus und können nicht mit der Visual Basic-Fehlerfangung abgefangen werden. Beim Aufrufen von DLL-Funktionen sollten Sie jeden Rückgabewert auf Erfolg oder Fehler (gemäß den API-Spezifikationen) überprüfen und im Falle eines Fehlers den Wert in der Eigenschaft des ErrLastDLLError Objekts überprüfen.

Beispiel

In diesem Beispiel wird zunächst die On Error GoTo -Anweisung verwendet, um den Speicherort einer Fehlerbehandlungsroutine innerhalb einer Prozedur anzugeben. Im Beispiel generiert ein Versuch, durch null zu dividieren, die Fehlernummer 6. Der Fehler wird in der Fehlerbehandlungsroutine behandelt, und die Steuerung wird dann an die Anweisung zurückgegeben, die den Fehler verursacht hat. Die On Error GoTo 0 -Anweisung deaktiviert die Fehlerabfangung. Anschließend wird die On Error Resume Next -Anweisung verwendet, um das Abfangen von Fehlern zu verzögern, sodass der Kontext für den fehler, der von der nächsten Anweisung generiert wird, für sicher bekannt sein kann. Beachten Sie, dass verwendet wird, Err.Clear um die Err Eigenschaften des 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

Versammlung: Visual Basic-Runtimebibliothek (in Microsoft.VisualBasic.dll)

Weitere Informationen