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, ist im Allgemeinen effizienter und wird daher empfohlen, wenn Laufzeitfehler in Ihrer Anwendung behandelt werden.

Ohne Fehlerbehandlung oder Ausnahmebehandlung ist jeder Laufzeitfehler, der auftritt, tödlich: eine Fehlermeldung wird angezeigt, und die Ausführung wird beendet.

Hinweis

Das Error Schlüsselwort wird auch in der Error-Anweisung verwendet, die für die 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 Zeilenargument ist eine beliebige Zeilenbezeichnung oder Zeilennummer. Wenn ein Laufzeitfehler auftritt, steuern Sie Verzweigungen an die angegebene Zeile, wodurch der Fehlerhandler aktiv wird. Die angegebene Zeile muss sich in derselben Prozedur wie die On Error Anweisung befinden, oder ein Kompilierungszeitfehler tritt auf.
GoTo 0 Deaktiviert den aktivierten Fehlerhandler in der aktuellen Prozedur und setzt ihn auf Nothing.
GoTo -1 Deaktiviert die aktivierte Ausnahme in der aktuellen Prozedur und setzt sie auf Nothing.
Resume Next Gibt an, dass, wenn ein Laufzeitfehler auftritt, das Steuerelement direkt nach der Anweisung, in der der Fehler aufgetreten ist, an die Anweisung wechselt, und die Ausführung wird von diesem Punkt fortgesetzt. Verwenden Sie dieses Formular anstelle On Error GoTo des Zugriffs auf Objekte.

Hinweise

Hinweis

Es wird empfohlen, die strukturierte Ausnahmebehandlung in Ihrem Code immer möglich zu verwenden, anstatt die 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 ist. Ein "aktiver" Fehlerhandler ist ein aktivierter Handler, der sich im Prozess der Behandlung eines Fehlers befindet.

Wenn ein Fehler auftritt, während ein Fehlerhandler aktiv ist (zwischen dem Auftreten des Fehlers und einer ResumeExit Sub, Exit Function, oder Exit Property Anweisung), kann der Fehlerhandler der aktuellen Prozedur den Fehler nicht behandeln. Das Steuerelement wird zur aufrufenden Prozedur zurückgegeben.

Wenn die aufrufende Prozedur über einen aktivierten Fehlerhandler verfügt, wird sie aktiviert, um den Fehler zu behandeln. Wenn der Fehlerhandler der Aufrufprozedur auch aktiv ist, übergibt das Steuerelement vorherige Aufrufprozeduren zurück, bis ein aktivierter, aber inaktiver Fehlerhandler gefunden wird. Wenn kein solcher Fehlerhandler gefunden wird, ist der Fehler am Zeitpunkt, an dem er tatsächlich aufgetreten ist, tödlich.

Jedes Mal, wenn der Fehlerhandler die Kontrolle an eine aufrufte Prozedur übergibt, wird diese Prozedur zur aktuellen Prozedur. Sobald ein Fehler von einem Fehlerhandler in einer beliebigen Prozedur behandelt wird, wird die Ausführung an dem von der Resume Anweisung festgelegten Punkt in der aktuellen Prozedur fortgesetzt.

Hinweis

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

Number-Eigenschaft

Fehlerbehandlungsroutinen basieren auf dem Wert in der Number Eigenschaft des Err Objekts, um die Ursache des Fehlers zu bestimmen. Die Routine sollte relevante Eigenschaftswerte im Err Objekt testen oder speichern, bevor ein anderer Fehler auftreten kann oder bevor eine Prozedur, die einen Fehler verursachen kann, aufgerufen wird. Die Eigenschaftswerte im Err Objekt spiegeln nur den neuesten Fehler wider. Die zugeordnete Err.Number Fehlermeldung ist in Err.Description.

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 abgeleiteter Ausnahmetypen zu unterstützen, wird eine Throw Anweisung in der Sprache unterstützt. Dadurch wird ein einzelner Parameter verwendet, der die Ausnahmeinstanz ist, die ausgelöst werden soll. Das folgende Beispiel zeigt, wie diese Features mit der vorhandenen Unterstützung für die Ausnahmebehandlung 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 unmittelbar nach dem letzten Aufruf der Prozedur, 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 platzieren, in der der Fehler auftritt, anstatt die Steuerung an einen anderen Ort 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 Inlinefehlerbehandlung innerhalb dieser Routine erforderlich ist.

Hinweis

Das On Error Resume Next Konstrukt kann bevorzugt On Error GoTo werden, wenn Fehler behandelt werden, die während des Zugriffs auf andere Objekte generiert werden. Überprüfung Err nach jeder Interaktion mit einem Objekt entfernt Mehrdeutigkeit darüber, auf welches Objekt durch den Code zugegriffen wurde. Sie können sicher sein, in welchem Objekt der Fehlercode Err.Numbereingefügt wurde, sowie welches Objekt ursprünglich den Fehler generiert hat (das in Err.Source).

On Error GoTo 0

On Error GoTo 0 deaktiviert die Fehlerbehandlung in der aktuellen Prozedur. Die 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.

On Error GoTo -1

On Error GoTo -1 deaktiviert die Ausnahme in der aktuellen Prozedur. Die Zeile -1 wird nicht als Anfang des Fehlerbehandlungscodes angegeben, auch wenn die Prozedur eine Zeile mit der Nummer -1 enthält. On Error GoTo -1 Ohne eine 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 oder Exit FunctionExit Property eine Exit SubAnweisung unmittelbar vor der Fehlerbehandlungsroutine, wie im folgenden Fragment:

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 stellt die Anweisung voran, um sie End Sub vom Prozedurfluss zu trennen. Sie können Fehlerbehandlungscode an einer beliebigen Stelle in einer Prozedur platzieren.

Nichttrappierte Fehler

Untrappierte Fehler in Objekten werden an die steuerungsfähige Anwendung zurückgegeben, wenn das Objekt als ausführbare Datei ausgeführt wird. Innerhalb der Entwicklungsumgebung werden untrappierte Fehler nur dann an die steuernde Anwendung zurückgegeben, wenn die richtigen Optionen festgelegt werden. In der Dokumentation ihrer Hostanwendung finden Sie eine Beschreibung, welche Optionen beim Debuggen festgelegt werden sollen, wie sie festgelegt werden sollen, 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 sie zurückgibt. Wenn sie nicht möglich sind, ordnen Sie die Fehlercodes Err.Number einem ihrer eigenen Fehler zu, und übergeben Sie sie dann an den Aufrufer Ihres Objekts. Sie sollten Ihren Fehler angeben, indem Sie der VbObjectError Konstante Ihren Fehlercode hinzufügen. Wenn ihr Fehlercode beispielsweise 1052 lautet, weisen Sie ihn wie folgt zu:

Err.Number = vbObjectError + 1052

Achtung

Systemfehler bei Aufrufen von Windows dynamischen Verknüpfungsbibliotheken (DLLs) lösen keine Ausnahmen aus und können nicht mit Visual Basic Fehlerfang 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, die Fehlernummer 6 zu dividieren. Der Fehler wird in der Fehlerbehandlungsroutine behandelt, und das Steuerelement 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 Anweisung verwendet, um die On Error Resume Next Fehlerauffangung zurückzuweisen, sodass der Kontext für den von der nächsten Anweisung generierten Fehler für bestimmte Zwecke bekannt sein kann. Beachten Sie, dass verwendet wird, Err.Clear um die Eigenschaften des Err Objekts nach der Behandlung des Fehlers zu löschen.

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 Runtime Library (in Microsoft.VisualBasic.dll)

Weitere Informationen