Freigeben über


On Error-Anweisung

Aktiviert eine Fehlerbehandlungsroutine und gibt die Position der Routine innerhalb einer Prozedur an. Kann auch zum Deaktivieren einer Fehlerbehandlungsroutine verwendet werden.

Syntax

On Error GoToline
On Error Resume Next
On Error GoTo 0

Die Syntax der On Error-Anweisung kann die folgenden Formen aufweisen:

Anweisung Beschreibung
On Error GoToline Aktiviert die Fehlerbehandlungsroutine, die bei line beginnt (angegeben im erforderlichen line-Argument).

Das line-Argument ist eine beliebige Zeilenbezeichnung oder Zeilennummer.

Wenn ein Laufzeitfehler auftritt, kontrollieren Sie Verzweigungen zu line, wodurch der Fehlerhandler aktiv wird.

Das angegebene line-Argument muss in derselben Prozedur wie die On Error-Anweisung vorhanden sein; andernfalls tritt ein compile-time-Fehler auf.
On Error Resume Next Legt fest, dass bei Auftreten eines Laufzeitfehlers die Steuerung zu der Anweisung geleitet wird, die unmittelbar auf die Anweisung folgt, bei der der Fehler aufgetreten ist und die Ausführung fortgesetzt wird. Verwenden Sie dies statt On Error GoTo beim Zugriff auf Objekte.
On Error GoTo 0 Deaktiviert jeden aktivierten Fehlerhandler in der aktuellen Prozedur.

Hinweise

Wenn Sie keine On Error-Anweisung verwenden, ist jeder Laufzeitfehler, der auftritt, schwerwiegend. D. h., es wird eine Fehlermeldung angezeigt, und die Ausführung wird beendet.

Ein „aktivierter“ Fehlerhandler ist ein durch eine On Error-Anweisung aktivierter Handler; ein „aktiver“ Fehlerhandler ist ein aktivierter Handler, der gerade einen Fehler behebt. 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 einen aktivierten Fehlerhandler hat, wird er zur Fehlerbehandlung aktiviert. Wenn der Fehlerhandler der aufrufenden Prozedur auch aktiv ist, wird die Steuerung an die vorherigen aufrufenden Prozeduren zurückgegeben, bis ein aktivierter, aber inaktiver Fehlerhandler gefunden wird. Wenn kein inaktiver, aktivierter Fehlerhandler gefunden wird, ist der Fehler an der Stelle schwerwiegend, an dem er tatsächlich aufgetreten ist.

Jedes Mal, wenn der Fehlerhandler die Steuerung wieder an die aufrufende Prozedur zurückgibt, wird diese Prozedur zur aktuellen Prozedur. Sobald ein Fehler durch einen Fehlerhandler in einer beliebigen Prozedur behandelt wurde, wird die Ausführung in der aktuellen Prozedur an der Stelle wiederaufgenommen, die von der Resume-Anweisung festgelegt wurde.

Hinweis

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

Fehlerbehandlungsroutinen nutzen den Wert in der Number-Eigenschaft des Err-Objekts, um die Ursache des Fehlers zu ermitteln. Die Fehlerbehandlungsroutine 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 kann. Die Eigenschaftswerte im Err -Objekt spiegeln nur den neuesten Fehler wieder. Die mit dem Err.Number -Objekt verknüpfte Fehlermeldung ist im Err.Description -Objekt enthalten.

On Error Resume Next sorgt dafür, dass die Ausführung mit der Anweisung fortgesetzt wird, die direkt nach der Anweisung folgt, die den Laufzeitfehler verursacht hat, oder mit der Anweisung, die direkt nach dem aktuellen Aufruf der Prozedur mit der On Error Resume Next-Anweisung folgt. Diese Anweisung lässt die Fortsetzung der Ausführung trotz Laufzeitfehler zu. Sie können die Fehlerbehandlungsroutine dort platzieren, wo der Fehler auftreten würde, statt die Steuerung an eine andere Position innerhalb der Prozedur zu übertragen. Eine On Error Resume Next-Anweisung wird inaktiv, wenn eine andere Prozedur aufgerufen wird. Sie sollten daher eine On Error Resume Next-Anweisung in jeder aufgerufenen Routine ausführen, wenn Sie eine Inline-Fehlerbehandlung für diese Routine wünschen.

Hinweis

Das On Error Resume Next -Konstrukt ist möglicherweise On Error GoTo bei der Behandlung von Fehlern vorzuziehen, die während des Zugriffs auf andere Objekte generiert wurden. Durch Überprüfung von Err nach jeder Interaktion mit einem Objekt werden hinsichtlich der Frage, auf welches Objekt über den Code zugegriffen wurde, Mehrdeutigkeiten vermieden. Sie können sicher sein, welches Objekt den Fehlercode in Err.Number platziert und welches Objekt den Fehler ursprünglich generiert hat (das in Err.Source angegebene Objekt).

On Error GoTo 0 deaktiviert die Fehlerbehandlung in der aktuellen Prozedur. Die Anweisung gibt die Zeile 0 nicht als Start des Fehlerbehandlungscodes an, 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.

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 in dem folgenden Fragment:

Sub InitializeMatrix(Var1, Var2, Var3, Var4) 
 On Error GoTo ErrorHandler 
 . . . 
 Exit Sub 
ErrorHandler: 
 . . . 
 Resume Next 
End Sub

Hier folgt der Fehlerbehandlungscode der Exit Sub -Anweisung und ist der End Sub-Anweisung vorangestellt, um ihn vom Prozedurfluss zu trennen. Der Fehlerbehandlungscode kann an einer beliebigen Stelle in einer Prozedur eingefügt werden.

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 Debugging festlegt werden sollten, wie Sie sie festlegen und ob der Host Klassen erstellen kann.

Wenn Sie ein Objekt erstellen, das auf andere Objekte zugreift, sollten Sie versuchen, Fehler zu behandeln, die von diesen nicht behandelt zurückgegeben werden. Wenn solche Fehler nicht behoben werden können, ordnen Sie den Fehlercode im Err.Number -Objekt einem Ihrer eigenen Fehler zu, und senden Sie sie dann zurück an den Aufrufer des Objekts. Sie sollten Ihren Fehler angeben, indem Sie den Fehlercode der vbObjectError -Konstante hinzufügen. Wenn der Fehlercode beispielsweise 1052 ist, weisen Sie ihn wie folgt zu:

Err.Number = vbObjectError + 1052 

Hinweis

Systemfehler, die beim Aufrufen von Dynamic Link Libraries (DLLs) von Windows oder von Macintosh-Coderessourcen auftreten, lösen keine Ausnahme aus und können nicht mit der Visual Basic-Fehlerbehebung abgefangen werden. Beim Aufrufen von DLL-Funktionen sollten Sie jeden Rückgabewert hinsichtlich Erfolg oder Fehler (gemäß den API-Spezifikationen) überprüfen, und bei einem Fehler den Wert in der LastDLLError-Eigenschaft des Err-Objekts überprüfen. LastDLLError gibt auf Macintosh immer Null zurück.

Beispiel

In diesem Beispiel wird zuerst die On Error GoTo -Anweisung verwendet, um die Position einer Fehlerbehandlungsroutine innerhalb einer Prozedur anzugeben. In dem Beispiel wird durch den Versuch, eine geöffnete Datei zu löschen, der Fehler 55 generiert. 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 Fehlerbehebung.

Die On Error Resume Next-Anweisung wird dann verwendet, um die Fehlerbehebung zu verzögern, sodass der Kontext für den durch die nächste Anweisung generierten Fehler mit Gewissheit bekannt sein kann. Beachten Sie, dass das Err.Clear-Objekt verwendet wird, um die Eigenschaften des Err-Objekts zu löschen, nachdem der Fehler behoben wurde.

Sub OnErrorStatementDemo() 
 On Error GoTo ErrorHandler ' Enable error-handling routine. 
 Open "TESTFILE" For Output As #1 ' Open file for output. 
 Kill "TESTFILE" ' Attempt to delete open 
 ' file. 
 On Error Goto 0 ' Turn off error trapping. 
 On Error Resume Next ' Defer error trapping. 
 ObjectRef = GetObject("MyWord.Basic") ' Try to start nonexistent 
 ' object, then test for 
'Check for likely Automation errors. 
 If Err.Number = 440 Or Err.Number = 432 Then 
 ' Tell user what happened. Then clear the Err object. 
 Msg = "There was an error attempting to open the Automation object!" 
 MsgBox Msg, , "Deferred Error Test" 
 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 55 ' "File already open" error. 
 Close #1 ' Close open file. 
 Case Else 
 ' Handle other situations here... 
 End Select 
 Resume ' Resume execution at same line 
 ' that caused the error. 
End Sub

Siehe auch

Support und Feedback

Haben Sie Fragen oder Feedback zu Office VBA oder zu dieser Dokumentation? Unter Office VBA-Support und Feedback finden Sie Hilfestellung zu den Möglichkeiten, wie Sie Support erhalten und Feedback abgeben können.