Share via


Übersicht über die unstrukturierte Ausnahmebehandlung

Aktualisiert: November 2007

Bei der unstrukturierten Ausnahmebehandlung platzieren Sie an den Anfang eines Codeblocks eine On Error-Anweisung, die dann alle Fehler behandelt, die in diesem Block vorkommen. Wenn nach Ausführung der On Error-Anweisung eine Ausnahme in einer Prozedur ausgelöst wird, verzweigt sich das Programm zu dem in der On Error-Anweisung angegebenen Zeilenargument. Das Zeilenargument, eine Zeilennummer oder Zeilenbezeichnung, gibt die Position des Ausnahmehandlers an.

In einigen Fällen tritt eine Ausnahme in einer von der ursprünglichen Prozedur aufgerufenen weiteren Prozedur auf. Dabei wird die Ausnahme an die aufrufende Prozedur zurückübertragen, wenn die aufgerufene Prozedur sie nicht behandelt, und die Ausführung verzweigt sich zum Zeilenargument.

Hinweis:

Die unstrukturierte Fehlerbehandlung mit On Error kann sich nachteilig auf die Anwendungsleistung auswirken und Code erzeugen, der schwer zu debuggen und zu verwalten ist. Es wird die Methode der strukturierten Fehlerbehandlung empfohlen. Weitere Informationen finden Sie unter Übersicht über die strukturierte Ausnahmebehandlung für Visual Basic.

On Error GoTo-Zeile

Die On Error GoTo Line-Anweisung geht davon aus, dass der Fehlerbehandlungscode in der Zeile beginnt, die im erforderlichen line-Argument angegeben ist. Wenn ein Laufzeitfehler auftritt, zweigt die Steuerung zu der im Argument angegebenen Zeilenbezeichnung oder Zeilennummer ab und aktiviert dadurch den Fehlerhandler*.* Die angegebene Zeile muss sich in derselben Prozedur wie die On Error GoTo Line-Anweisung befinden. Andernfalls generiert Visual Basic einen Compilerfehler. Im folgenden Beispiel wird die Verwendung eines Fehlerhandlers mit einer Zeilenbezeichnung veranschaulicht:

Sub TestSub
   On Error GoTo ErrorHandler
      ' Code that may or may not contain errors.
   Exit Sub

   ErrorHandler:
      ' Code that handles errors.
      Resume
End Sub

Das Beispiel enthält einen Fehlerhandler mit der Bezeichnung ErrorHandler. Wenn der Code in der TestSub-Unterroutine einen Fehler generiert, führt Visual Basic sofort den auf die ErrorHandler-Bezeichnung folgenden Code aus. Am Ende des Fehlerbehandlungsblocks übergibt die Resume-Anweisung die Steuerung wieder an die Codezeile, in der der Fehler ausgelöst wurde. Der restliche Teil der Unterroutine wird ausgeführt, als ob der Fehler nicht aufgetreten wäre.

Hinweis:

Sie müssen unmittelbar vor den Fehlerbehandlungsblock eine Exit Sub-Anweisung einfügen. Andernfalls führt Visual Basic den Fehlerbehandlungscode am Ende der Unterroutine aus, was zu unerwünschten oder unerwarteten Ergebnissen führt.

On Error Resume Next

Die On Error Resume Next-Anweisung gibt an, dass im Falle eines Laufzeitfehlers die Steuerung an die Anweisung übergeben wird, die unmittelbar auf die Anweisung folgt, in welcher der Fehler aufgetreten ist. Die Ausführung wird zu diesem Zeitpunkt fortgesetzt. On Error Resume Next ermöglicht das Einfügen von Fehlerbehandlungsroutinen an der Stelle, an der Fehler auftreten, statt die Steuerung an eine andere Stelle in der Prozedur zu übertragen.

Hinweis:

Wenn die Prozedur eine andere Prozedur aufruft, wird die On Error Resume Next-Anweisung während der Ausführung der aufgerufenen Prozedur deaktiviert. Aus diesem Grund sollten Sie in jede aufgerufene Prozedur, die dies erfordert, eine On Error Resume Next-Anweisung einfügen. Dies ist nötig, weil Resume Next nur für die Prozedur gilt, die die On Error Resume Next-Anweisung enthält. Wenn in einer aufgerufenen Prozedur ein nicht behandelter Fehler auftritt, wird die Ausnahme an die aufrufende Prozedur zurückübertragen, und die Ausführung wird bei der Anweisung fortgesetzt, die auf den Aufruf folgt. In solchen Fällen wird der Fehler nicht behandelt.

Resume kann auch eigenständig, außerhalb der On Error-Anweisung, verwendet werden. Wenn Resume auf diese Weise verwendet wird, gibt Visual Basic die Steuerung an die Anweisung zurück, die den Fehler verursacht hat. Resume wird in der Regel verwendet, nachdem der Fehler durch einen Fehlerhandler behoben wurde.

Visual Basic bietet darüber hinaus auch die Resume Next-Anweisung, die die Steuerung an die Zeile übergibt, die unmittelbar auf die Codezeile folgt, die den Fehler verursacht hat. Resume Next kann bei Fehlern verwendet werden, die die weitere Ausführung der Anwendung nicht verhindern. Ferner können Sie diese Anweisung für Fehler verwenden, die die erwarteten Ergebnisse der Unterroutine nicht ändern.

Eine weitere Variante der Resume-Anweisung ist Resume Line, die mit On Error GoTo Line vergleichbar ist. Resume Line übergibt die Steuerung an eine Zeile, die Sie im line-Argument angeben. Sie können Resume Line nur innerhalb eines Fehlerhandlers verwenden.

Hinweis:

Beim Debuggen von Code müssen Sie die On Error Resume Next-Anweisung deaktivieren.

On Error GoTo 0

Die On Error GoTo 0-Anweisung deaktiviert alle Fehlerhandler in der aktuellen Prozedur. Wenn Sie keine On Error GoTo 0-Anweisung einfügen, bleibt der Fehlerhandler deaktiviert, wenn die Prozedur endet, die den Ausnahmehandler enthält.

Hinweis:

Die On Error GoTo 0-Anweisung soll nicht Zeile 0 (null) als Anfang des Fehlerbehandlungscodes angeben, selbst wenn die Prozedur eine mit der Nummer 0 versehene Zeile enthält.

On Error GoTo -1

Die On Error GoTo -1-Anweisung deaktiviert alle Ausnahmehandler in der aktuellen Prozedur. Wenn Sie keine On Error GoTo -1-Anweisung einfügen, wird die Ausnahme automatisch deaktiviert, wenn die dazugehörige Prozedur endet.

Hinweis:

Die On Error GoTo -1-Anweisung soll nicht Zeile -1 als Anfang des Fehlerbehandlungscodes angeben, selbst wenn die Prozedur eine mit der Zahl -1 versehene Zeile enthält.

Beispiel für einen unstrukturierten Ausnahmehandler

Im folgenden Code lautet der Name des Ausnahmehandlers DivideByZero. Er behandelt einen bestimmten Fehler, nämlich den Versuch, einen Wert durch null zu dividieren. Wenn ein anderer Fehler auftritt, generiert Visual Basic einen Laufzeitfehler und beendet die Anwendung.

Sub ErrorTest ()
' Declare variables.
   Dim x As Integer, y As Integer, z As Integer
   ' The exception handler is named "DivideByZero".
   On Error GoTo DivideByZero
   ' The main part of the code, which might cause an error.
   x = 2
   y = 0
   z = x \ y

   ' This line disables the exception handler.
   On Error GoTo 0
      Console.WriteLine(x & "/" & y & " = " & z)

   ' Exit the subroutine before the error-handling code.
   ' Failure to do so can create unexpected results.
   Exit Sub

   ' This is the exception handler, which deals with the error.
   DivideByZero:
   ' Include a friendly message to let the user know what is happening.
   Console.WriteLine("You have attempted to divide by zero!")

   ' Provide a solution to the error.
   y = 2

   ' The Resume statement returns to the point at which
   ' the error first occurred, so the application
   ' can continue to run.
   Resume

End Sub

Siehe auch

Aufgaben

Gewusst wie: Abrufen von Informationen aus einem Fehlerobjekt

Konzepte

Err-Objekt in der unstrukturierten Ausnahmebehandlung

Einführung in die Ausnahmebehandlung

Fehlertypen

Verwenden der strukturierten und der unstrukturierten Ausnahmebehandlung

Referenz

End-Anweisung

Err-Objekt (Visual Basic)

Exit-Anweisung (Visual Basic)

On Error-Anweisung (Visual Basic)

Resume-Anweisung