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 |
---|---|
GoTo Linie |
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 Function
oder 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.Description
enthalten.
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.Number
platziert hat und welches Objekt den Fehler ursprünglich generiert hat (das in Err.Source
angegebene 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 Err
LastDLLError
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)