Übersicht über die strukturierte Ausnahmebehandlung für Visual Basic

Aktualisiert: Juli 2008

Visual Basic unterstützt die strukturierte Ausnahmebehandlung, mit der Sie Programme mit stabilen, umfassenden Fehlerhandlern erstellen und verwalten können. Bei der strukturierten Ausnahmebehandlung handelt es sich um Code zur Ermittlung und Behebung von Fehlern während der Ausführung, in dem eine Kontrollstruktur (vergleichbar mit Select Case oder While) mit Ausnahmen, geschützten Codeblöcken und Filtern kombiniert wird.

Mit der Try...Catch...Finally-Anweisung können Sie Codeblöcke schützen, die Fehler auslösen können. Ausnahmehandler können geschachtelt werden. In diesem Fall ist der Gültigkeitsbereich der in den einzelnen Blöcken deklarierten Variablen lokal.

Try...Catch...Finally-Anweisung

Im folgenden Code wird die Struktur einer Try...Catch...Finally-Anweisung gezeigt.

Try
    ' Starts a structured exception handler.
    ' Place executable statements that may generate 
    ' an exception in this block.
Catch '[optional filters]
    ' This code runs if the statements listed in 
    ' the Try block fail and the filter on the Catch statement is true.
'[Additional Catch blocks]
Finally
    ' This code always runs immediately before
    ' the Try statement exits.
End Try
' Ends a structured exception handler.

Der Try-Block eines Try...Catch...Finally-Ausnahmehandlers enthält den Codeabschnitt, der auf Ausnahmen überwacht werden soll. Wenn beim Ausführen dieses Abschnitts ein Fehler auftritt, untersucht Visual Basic jede Catch-Anweisung innerhalb von Try...Catch...Finally, bis es eine Bedingung findet, die diesem Fehler entspricht. In diesem Fall übernimmt die erste Zeile des Codes im Catch-Block die Steuerung. Wenn keine übereinstimmende Catch-Anweisung ermittelt wird, wird die Suche auf die Catch-Anweisungen des äußeren Try...Catch...Finally-Blocks ausgedehnt, der den Block enthält, in dem die Ausnahme aufgetreten ist. Der gesamte Stapel wird so lange weiter durchsucht, bis in der aktuellen Prozedur ein übereinstimmender Catch-Block gefunden wird. Wird kein solcher Block gefunden, wird ein Fehler generiert.

Der Code im Finally-Abschnitt wird immer zuletzt ausgeführt, kurz vor Ende des Gültigkeitsbereichs des Fehlerbehandlungsblocks. Dies erfolgt unabhängig davon, ob der Code in den Catch-Blöcken ausgeführt wurde. Schreiben Sie Bereinigungscode, z. B. zum Schließen von Dateien und Freigeben von Objekten, in den Finally-Abschnitt. Wenn Sie keine Ausnahmen abfangen, Ressourcen aber bereinigen müssen, sollten Sie die Using-Anweisung anstelle eines Finally-Abschnitts verwenden. Weitere Informationen finden Sie unter Using-Anweisung (Visual Basic).

Filtern von Fehlern im Catch-Block

Catch-Blöcke lassen drei Optionen zum Filtern bestimmter Fehler zu. Bei der ersten Option werden Fehler basierend auf der Klasse der Ausnahme gefiltert (in diesem Fall ClassLoadException), siehe folgenden Beispielcode.

Try
    ' "Try" block.
Catch e as ClassLoadException
    ' "Catch" block.
Finally
    ' "Finally" block.
End Try

Wenn ein ClassLoadException-Fehler auftritt, wird der Code ausgeführt, der sich im angegebenen Catch-Block befindet.

Bei der zweiten Fehlerfilteroption kann der Catch-Abschnitt jeden zusätzlichen Ausdruck filtern. Dieser Typ von Catch-Filtern wird in der Regel zum Testen auf bestimmte Fehlernummern verwendet (siehe folgenden Code).

Try
   ' "Try" block.
Catch When ErrNum = 5 'Type mismatch.
   ' "Catch" block.
Finally
   ' "Finally" block.
End Try

Wenn Visual Basic den übereinstimmenden Fehlerhandler findet, wird der Code in diesem Handler ausgeführt und anschließend die Steuerung an den Finally-Block übergeben.

Hinweis:

Wenn Sie versuchen, einen Catch-Block für die Behandlung einer Ausnahme zu finden, wird der Handler jedes Blocks überprüft, bis eine Übereinstimmung gefunden wurde. Da es sich bei diesen Handlern um Funktionsaufrufe handeln kann, können unerwünschte Nebeneffekte auftreten; z. B. kann durch einen solchen Aufruf eine öffentliche Variable geändert werden, die dann im Code eines anderen Catch-Blocks verwendet wird, der letztendlich die Ausnahme behandelt.

Als dritte Alternative können Sie die erste und die zweite Option miteinander kombinieren und beide für die Ausnahmebehandlung verwenden. Die Catch-Anweisungen sollten von der spezifischsten zur allgemeinsten Ausnahme vorgehen. Ein Catch-Block fängt alle Ausnahmen von Exception ab. Er sollte daher immer der letzte Block vor Finally sein.

Verzweigungen aus Try...Catch-Blöcken

Es besteht die Möglichkeit, von einem Catch-Block zurück zur ursprünglichen Try-Anweisung oder zur End Try-Anweisung zu verzweigen. Es ist jedoch nicht möglich, in einen einschließenden Try…Catch-Block zu verzweigen. Dies wird hier gezeigt:

Beispiel für einen strukturierten Ausnahmehandler

Das folgende Beispiel zeigt einen weiteren einfachen Fehlerhandler, der die Try...Catch...Finally-Anweisung verwendet.

Option Strict On
Imports System.IO

Module Module1
    Private Const FileName As String = "TestFile.data"

    Public Sub Main()

        ' First, create a new data file and write some data to the file.
        ' 1. Create the new, empty data file.
        If File.Exists(FileName) Then
            File.Delete(FileName)
        End If
        Dim fs As New FileStream(FileName, FileMode.CreateNew)

        ' 2. Create a BinaryWriter object for the data.
        Dim writer As New BinaryWriter(fs)

        ' 3. Write some sample data to the file.
        For i = 0 To 10
            writer.Write(i)
        Next i
        writer.Close()
        fs.Close()

        ' Now read from the file you just made.
        ' 1. Create a BinaryReader object for the data stream.
        fs = New FileStream(FileName, FileMode.Open, FileAccess.Read)
        Dim reader As New BinaryReader(fs)

        ' 2. Read data from TestFile.data. The loop terminates with an
        ' EndOfStreamException when an attempt is made to read past
        ' the end of the stream.
        Try
            ' This loop terminates with an EndOfStreamException when it 
            ' reaches the end of the stream.
            While True
                Console.WriteLine(reader.ReadInt32())
            End While
            Console.WriteLine("The data was read with no error.")
        ' 3. Report the first error that is caught, if there is one.
        Catch eosExcep As EndOfStreamException
            ' This Catch block is executed when the reader attempts
            ' to read past the end of the stream.
            Console.WriteLine("End-of-stream exception occurred.")
        Catch IOExcep As System.IO.IOException
            ' For this Catch block, some other error occurred before
            ' the end of stream was reached. Print the standard
            ' exception message.
            Console.WriteLine(IOExcep.Message)
        Finally
            ' The Finally block is always executed.
            Console.WriteLine("Executing the Finally block.")
            reader.Close()
            fs.Close()
        End Try
    End Sub

End Module

Der Finally-Block wird immer ausgeführt, unabhängig davon, welche Aktionen in den vorangegangenen Catch-Blöcken ausgeführt wurden. Bei der strukturierten Ausnahmebehandlung können Sie Resume oder Resume Next nicht verwenden.

Hinweis:

Im vorhergehenden Beispiel wird jede Ausnahme außer der IOException-Klasse oder der EndOfStreamException-Klasse unverarbeitet zum Aufrufer zurückübertragen.

Siehe auch

Aufgaben

Problembehandlung bei der Ausnahmebehandlung

Konzepte

Einführung in die Ausnahmebehandlung

Fehlertypen

Übersicht über die unstrukturierte Ausnahmebehandlung

Referenz

Try...Catch...Finally-Anweisung (Visual Basic)

BinaryReader

BinaryWriter

FileStream

Weitere Ressourcen

Ausnahmebehandlungsaufgaben

Änderungsprotokoll

Date

Versionsgeschichte

Grund

Juli 2008

Ersetzt das Beispiel im Abschnitt "Beispiel für einen strukturierten Ausnahmehandler".

Kundenfeedback.