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

Bietet eine Möglichkeit, einige oder alle möglichen Fehler zu behandeln, die beim Ausführen von Code in einem bestimmten Codeblock auftreten können.Provides a way to handle some or all possible errors that may occur in a given block of code, while still running code.

SyntaxSyntax

Try  
    [ tryStatements ]  
    [ Exit Try ]  
[ Catch [ exception [ As type ] ] [ When expression ]  
    [ catchStatements ]  
    [ Exit Try ] ]  
[ Catch ... ]  
[ Finally  
    [ finallyStatements ] ]  
End Try  

TeileParts

BegriffTerm DefinitionDefinition
tryStatements Dies ist optional.Optional. Anweisungen, in denen ein Fehler auftreten kann.Statement(s) where an error can occur. Kann eine Verbundanweisung sein.Can be a compound statement.
Catch Dies ist optional.Optional. Mehrere Catch Blöcken zulässig.Multiple Catch blocks permitted. Wenn eine Ausnahme auftritt, bei der Verarbeitung der Try blockieren, von denen jede Catch Anweisung wird in der Reihenfolge zu bestimmen, ob es die Ausnahme, wobei behandelt im Text überprüft exception , die die Ausnahme, die ausgelöst wurde, darstellt.If an exception occurs when processing the Try block, each Catch statement is examined in textual order to determine whether it handles the exception, with exception representing the exception that has been thrown.
exception Dies ist optional.Optional. Ein beliebiger Variablenname.Any variable name. Der Anfangswert von exception ist der Wert des ausgelösten Fehlers.The initial value of exception is the value of the thrown error. Mit verwendet Catch an der Fehler abgefangen.Used with Catch to specify the error caught. Wenn nicht angegeben, die Catch Anweisung fängt jede Ausnahme.If omitted, the Catch statement catches any exception.
type Dies ist optional.Optional. Gibt den Typ des Klassenfilters.Specifies the type of class filter. Wenn der Wert des exception entspricht dem Typ gemäß type oder eines abgeleiteten Typs, der Bezeichner auf das Ausnahmeobjekt gebunden wird.If the value of exception is of the type specified by type or of a derived type, the identifier becomes bound to the exception object.
When Dies ist optional.Optional. Ein Catch -Anweisung mit einem When Klausel fängt Ausnahmen nur dann, wenn expression ergibt True.A Catch statement with a When clause catches exceptions only when expression evaluates to True. Ein When Klausel wird nur angewendet, nachdem der Typ der Ausnahme ist, überprüft und expression bezieht sich möglicherweise auf den Bezeichner, der die Ausnahme darstellt.A When clause is applied only after checking the type of the exception, and expression may refer to the identifier representing the exception.
expression Dies ist optional.Optional. Muss implizit in Boolean.Must be implicitly convertible to Boolean. Ein Ausdruck, der einen generischen Filter beschreibt.Any expression that describes a generic filter. In der Regel verwendet zum Filtern nach Fehlernummer.Typically used to filter by error number. Mit verwendet When Schlüsselwort, um die Angabe der Umstände, unter dem der Fehler abgefangen wird.Used with When keyword to specify circumstances under which the error is caught.
catchStatements Dies ist optional.Optional. Anweisungen, um Fehler zu behandeln, die auftreten, in der zugeordneten Try Block.Statement(s) to handle errors that occur in the associated Try block. Kann eine Verbundanweisung sein.Can be a compound statement.
Exit Try Dies ist optional.Optional. Schlüsselwort, das von unterbricht die Try...Catch...Finally Struktur.Keyword that breaks out of the Try...Catch...Finally structure. Ausführung fortgesetzt wird, durch den Code direkt nach der End Try Anweisung.Execution resumes with the code immediately following the End Try statement. Die Finally -Anweisung wird weiterhin ausgeführt werden.The Finally statement will still be executed. Nicht zulässig Finally Blöcke.Not allowed in Finally blocks.
Finally Dies ist optional.Optional. Ein Finally Block wird immer ausgeführt, wenn die Ausführung eines beliebigen Teils der Try...Catch Anweisung.A Finally block is always executed when execution leaves any part of the Try...Catch statement.
finallyStatements Dies ist optional.Optional. Anweisungen, die ausgeführt werden, nachdem sämtlicher Fehler aufgetreten ist.Statement(s) that are executed after all other error processing has occurred.
End Try Beendet die Try...Catch...Finally Struktur.Terminates the Try...Catch...Finally structure.

HinweiseRemarks

Wenn Sie erwarten, dass eine bestimmte Ausnahme während einer bestimmten Codeabschnitt auftreten kann, fügen Sie den Code in eine Try blockieren, und Verwenden einer Catch Block zum Beibehalten der Kontrolle und die Ausnahme zu behandeln, wenn es auftritt.If you expect that a particular exception might occur during a particular section of code, put the code in a Try block and use a Catch block to retain control and handle the exception if it occurs.

Ein Try…Catch Anweisung besteht aus einem Try -Block gefolgt von einer oder mehreren Catch Klauseln, die Handler für verschiedene Ausnahmen angeben.A Try…Catch statement consists of a Try block followed by one or more Catch clauses, which specify handlers for various exceptions. Wenn eine Ausnahme ausgelöst wird, eine Try blockieren, Visual Basic sieht für den Catch Anweisung, die die Ausnahme behandelt.When an exception is thrown in a Try block, Visual Basic looks for the Catch statement that handles the exception. Wenn kein übereinstimmendes Catch Anweisung nicht gefunden wird, Visual Basic überprüft die Methode, die die aktuelle Methode, und so weiter oben in der Aufrufliste aufgerufen.If a matching Catch statement is not found, Visual Basic examines the method that called the current method, and so on up the call stack. Wenn kein Catch -Block gefunden wird, Visual Basic zeigt die Meldung zu einer nicht behandelten Ausnahme an den Benutzer an und beendet die Ausführung des Programms.If no Catch block is found, Visual Basic displays an unhandled exception message to the user and stops execution of the program.

Sie können mehrere Catch -Anweisung in einer Try…Catch Anweisung.You can use more than one Catch statement in a Try…Catch statement. Wenn Sie die Reihenfolge der vorgehen, die Catch Klauseln ist von Bedeutung, da sie in der Reihenfolge untersucht werden.If you do this, the order of the Catch clauses is significant because they are examined in order. Fangen Sie spezifischere Ausnahmen vor den weniger spezifischen ab.Catch the more specific exceptions before the less specific ones.

Die folgenden Catch Anweisung Bedingungen sind der am wenigsten spezifischen und fängt alle Ausnahmen, die von Ableiten der Exception Klasse.The following Catch statement conditions are the least specific, and will catch all exceptions that derive from the Exception class. Kehren Sie normalerweise mithilfe einer der Variationen wie in den letzten Catch -block in der Try...Catch...Finally -Struktur verwenden, nachdem alle Sie erwarten, dass bestimmten Ausnahmen abfangen.You should ordinarily use one of these variations as the last Catch block in the Try...Catch...Finally structure, after catching all the specific exceptions you expect. Ablaufsteuerung erreichen niemals eine Catch Block, der entweder der Variationen folgt.Control flow can never reach a Catch block that follows either of these variations.

  • Die type ist Exception, z.B.: Catch ex As ExceptionThe type is Exception, for example: Catch ex As Exception

  • Die Anweisung hat keine exception Variablen, z.B.: CatchThe statement has no exception variable, for example: Catch

Wenn eine Try…Catch…Finally Anweisung in einer anderen geschachtelt ist Try Visual Basic-Block überprüft zuerst, jede Catch -Anweisung in der innersten Try Block.When a Try…Catch…Finally statement is nested in another Try block, Visual Basic first examines each Catch statement in the innermost Try block. Wenn kein übereinstimmendes Catch Anweisung gefunden wird, wird die Suche wird fortgesetzt, um die Catch Anweisungen von der äußeren Try…Catch…Finally Block.If no matching Catch statement is found, the search proceeds to the Catch statements of the outer Try…Catch…Finally block.

Lokale Variablen aus einer Try Block sind nicht verfügbar in eine Catch blockiert werden, da sie separate Blöcke sind.Local variables from a Try block are not available in a Catch block because they are separate blocks. Wenn Sie eine Variable in mehreren Blöcken verwenden möchten, deklarieren Sie die Variable außerhalb der Try...Catch...Finally Struktur.If you want to use a variable in more than one block, declare the variable outside the Try...Catch...Finally structure.

Tipp

Die Try…Catch…Finally -Anweisung ist als IntelliSense-Codeausschnitt verfügbar.The Try…Catch…Finally statement is available as an IntelliSense code snippet. Erweitern Sie im Codeausschnitt-Manager, Codemuster - If, For Each, Try Catch, Eigenschaft usw., und klicken Sie dann Fehlerbehandlung (Ausnahmen).In the Code Snippets Manager, expand Code Patterns - If, For Each, Try Catch, Property, etc, and then Error Handling (Exceptions). Weitere Informationen finden Sie unter Codeausschnitte.For more information, see Code Snippets.

Finally-blockFinally block

Wenn Sie eine oder mehrere Anweisungen, die ausgeführt werden muss verfügen, bevor Sie verlassen die Try strukturieren, verwenden Sie eine Finally Block.If you have one or more statements that must run before you exit the Try structure, use a Finally block. Die Steuerung an die Finally zu blockieren, nur verwendet werden, bevor sie übergeben die Try…Catch Struktur.Control passes to the Finally block just before it passes out of the Try…Catch structure. Dies gilt auch bei eine Ausnahme an einer beliebigen Stelle innerhalb der Try Struktur.This is true even if an exception occurs anywhere inside the Try structure.

Ein Finally -Block ist hilfreich beim Ausführen von Code, ausführen muss, auch wenn eine Ausnahme auftritt.A Finally block is useful for running any code that must execute even if there is an exception. Erhält die Kontrolle der Finally Block unabhängig davon, wie der Try...Catch block beendet wird.Control is passed to the Finally block regardless of how the Try...Catch block exits.

Der Code in eine Finally -Block ausgeführt, auch wenn Ihr Code Auftreten einer Return -Anweisung in einer Try oder Catch Block.The code in a Finally block runs even if your code encounters a Return statement in a Try or Catch block. Steuerelement übergibt die nicht von einem Try oder Catch Blockieren der entsprechenden Finally -block in den folgenden Fällen:Control does not pass from a Try or Catch block to the corresponding Finally block in the following cases:

Es ist nicht zulässig, die explizit die Ausführung in übertragen einer Finally Block.It is not valid to explicitly transfer execution into a Finally block. Übertragen die Ausführung von einem Finally Block ist nicht gültig, außer über eine Ausnahme.Transferring execution out of a Finally block is not valid, except through an exception.

Wenn eine Try -Anweisung enthält nicht mindestens eine Catch -Block muss enthalten eine Finally Block.If a Try statement does not contain at least one Catch block, it must contain a Finally block.

Tipp

Wenn Sie keine bestimmte Ausnahmen abgefangen der Using Anweisung verhält sich wie ein Try…Finally Block und garantiert die Freigabe der Ressourcen, unabhängig davon, wie Sie den Block zu beenden.If you do not have to catch specific exceptions, the Using statement behaves like a Try…Finally block, and guarantees disposal of the resources, regardless of how you exit the block. Dies gilt auch für eine nicht behandelte Ausnahme.This is true even with an unhandled exception. Weitere Informationen finden Sie unter using-Anweisung.For more information, see Using Statement.

Ausnahme-argumentException argument

Die Catch Block exception Argument ist eine Instanz der Exception Klasse oder eine abgeleitete Klasse die Exception Klasse.The Catch block exception argument is an instance of the Exception class or a class that derives from the Exception class. Die Exception Klasseninstanz entspricht des Fehlers in der Try Block.The Exception class instance corresponds to the error that occurred in the Try block.

Die Eigenschaften der Exception Objekt Hilfe, um die Ursache und den Speicherort einer Ausnahme anzugeben.The properties of the Exception object help to identify the cause and location of an exception. Z. B. die StackTrace Eigenschaftenlisten die aufgerufenen Methoden, die geführt, auf die Ausnahme, die helfen hat, in dem der Fehler im Code zu finden.For example, the StackTrace property lists the called methods that led to the exception, helping you find where the error occurred in the code. Message Gibt eine Meldung, die die Ausnahme beschreibt.Message returns a message that describes the exception. HelpLink Gibt einen Link zu einer zugeordneten Hilfedatei zurück.HelpLink returns a link to an associated Help file. InnerException Gibt die Exception Objekt, das der aktuellen Ausnahme ist, oder er hat gibt Nothing , wenn keine ursprüngliche Exception.InnerException returns the Exception object that caused the current exception, or it returns Nothing if there is no original Exception.

Überlegungen zur Verwendung ein Try... Catch-AnweisungConsiderations when using a Try…Catch statement

Verwenden einer Try…Catch Anweisung nur für das Vorkommen des für ungewöhnliche oder unerwartete Programmereignisse zu signalisieren.Use a Try…Catch statement only to signal the occurrence of unusual or unanticipated program events. Die folgenden: UrsachenReasons for this include the following:

  • Abfangen von Ausnahmen zur Laufzeit erstellt Mehraufwand und ist wahrscheinlich langsamer als die Prüfung vor, um Ausnahmen zu vermeiden.Catching exceptions at runtime creates additional overhead, and is likely to be slower than pre-checking to avoid exceptions.

  • Wenn eine Catch Block wird nicht ordnungsgemäß verarbeitet, die die Ausnahme möglicherweise nicht ordnungsgemäß an Benutzer gemeldet werden.If a Catch block is not handled correctly, the exception might not be reported correctly to users.

  • Behandlung von Ausnahmen wird ein Programm komplexer.Exception handling makes a program more complex.

Sie brauchen nicht immer eine Try…Catch Anweisung, um eine Bedingung geprüft, die zu rechnen ist.You do not always need a Try…Catch statement to check for a condition that is likely to occur. Das folgende Beispiel überprüft, ob eine Datei vorhanden ist, bevor Sie versuchen, ihn zu öffnen.The following example checks whether a file exists before trying to open it. Dies reduziert die Notwendigkeit, Abfangen einer Ausnahme wird ausgelöst, durch die OpenText Methode.This reduces the need for catching an exception thrown by the OpenText method.

Private Sub TextFileExample(ByVal filePath As String)

    ' Verify that the file exists.
    If System.IO.File.Exists(filePath) = False Then
        Console.Write("File Not Found: " & filePath)
    Else
        ' Open the text file and display its contents.
        Dim sr As System.IO.StreamReader =
            System.IO.File.OpenText(filePath)

        Console.Write(sr.ReadToEnd)

        sr.Close()
    End If
End Sub

Stellen Sie sicher, Code im Catch Blöcke Ausnahmen für Benutzer, ob durch eine Thread-sichere-Protokollierung oder die entsprechenden Nachrichten können ordnungsgemäß gemeldet werden.Ensure that code in Catch blocks can properly report exceptions to users, whether through thread-safe logging or appropriate messages. Andernfalls bleiben Ausnahmen möglicherweise unbekannt.Otherwise, exceptions might remain unknown.

Async-MethodenAsync methods

Wenn Sie eine Methode mit kennzeichnen die Async Modifizierer verwenden, können Sie die "await" Operator in der Methode.If you mark a method with the Async modifier, you can use the Await operator in the method. Eine Anweisung mit der Await -Operator hält die Ausführung der Methode, bis die erwartete Aufgabe abgeschlossen ist.A statement with the Await operator suspends execution of the method until the awaited task completes. Die Aufgabe stellt derzeit ausgeführte Arbeit dar.The task represents ongoing work. Wenn die Aufgaben im Zusammenhang mit der Await Operator abgeschlossen ist, Ausführung wird fortgesetzt, in der gleichen Methode.When the task that's associated with the Await operator finishes, execution resumes in the same method. Weitere Informationen finden Sie unter Ablaufsteuerung in asynchronen Programmen.For more information, see Control Flow in Async Programs.

Eine Aufgabe, die von einer asynchronen Methode zurückgegebene kann in einem fehlerhaften Zustand, beenden, der angibt, dass es aufgrund einer nicht behandelten Ausnahme abgeschlossen wurde.A task returned by an Async method may end in a faulted state, indicating that it completed due to an unhandled exception. Eine Aufgabe kann auch beenden, in einem abgebrochenen Zustand, sodass eine OperationCanceledException ausgelöst wird, aus der Await-Ausdruck.A task may also end in a canceled state, which results in an OperationCanceledException being thrown out of the await expression. Um entweder Typ der Ausnahme abzufangen, platzieren Sie die Await -Ausdruck, der die Aufgabe zugeordnet ist eine Try block, und fangen die Ausnahme in der Catch Block.To catch either type of exception, place the Await expression that's associated with the task in a Try block, and catch the exception in the Catch block. Ein Beispiel finden Sie weiter unten in diesem Thema.An example is provided later in this topic.

Eine Aufgabe kann in einem fehlerhaften Zustand sein, da mehrere Ausnahmen für die Fehler verantwortlich waren.A task can be in a faulted state because multiple exceptions were responsible for its faulting. Beispielsweise kann die Aufgabe das Ergebnis eines Aufrufs an Task.WhenAll sein.For example, the task might be the result of a call to Task.WhenAll. Wenn Sie eine solche Aufgabe warten, die abgefangene Ausnahme ist nur eine der Ausnahmen, und Sie können nicht vorhersagen, welche Ausnahme abgefangen wird.When you await such a task, the caught exception is only one of the exceptions, and you can't predict which exception will be caught. Ein Beispiel finden Sie weiter unten in diesem Thema.An example is provided later in this topic.

Ein Await Ausdruck kann nicht innerhalb einer Catch Block oder Finally Block.An Await expression can't be inside a Catch block or Finally block.

IteratorsIterators

Ein Iteratorfunktion oder Get Accessor führt eine benutzerdefinierte Iteration durch eine Auflistung.An iterator function or Get accessor performs a custom iteration over a collection. Ein Iterator verwendet eine Yield Anweisung, um jedes Element der Auflistung zu einem Zeitpunkt zurückzugeben.An iterator uses a Yield statement to return each element of the collection one at a time. Sie rufen eine Iteratorfunktion mithilfe einer für jede... Nächste Anweisung.You call an iterator function by using a For Each...Next Statement.

Ein Yield -Anweisung werden in einem Try Block.A Yield statement can be inside a Try block. Ein Try Block mit einer Yield -Anweisung kann verfügen Catch blockiert, und lassen eine Finally Block.A Try block that contains a Yield statement can have Catch blocks, and can have a Finally block. Finden Sie im Abschnitt "versuchen Sie es Blöcke in Visual Basic" Iteratoren verdeutlicht.See the "Try Blocks in Visual Basic" section of Iterators for an example.

Ein Yield Anweisung kann nicht innerhalb einer Catch Block oder ein Finally Block.A Yield statement cannot be inside a Catch block or a Finally block.

Wenn die For Each -Text (außerhalb der Iteratorfunktion) eine Ausnahme auslöst, ein Catch Block in der Iteratorfunktion wird nicht ausgeführt, aber ein Finally Block in der Iteratorfunktion ausgeführt wird.If the For Each body (outside of the iterator function) throws an exception, a Catch block in the iterator function is not executed, but a Finally block in the iterator function is executed. Ein Catch -Block in einem Iteratorfunktion erfasst nur die Ausnahmen, die innerhalb der Iteratorfunktion auftreten.A Catch block inside an iterator function catches only exceptions that occur inside the iterator function.

Teilweise vertrauenswürdigen UmgebungenPartial-trust situations

In teilweise vertrauenswürdigen Umgebungen, z. B. eine Anwendung, die auf einer Netzwerkfreigabe gehostet Try...Catch...Finally fängt keine Ausnahmen zur Codezugriffssicherheit, die auftreten, bevor die Methode, die den Aufruf enthält aufgerufen wird.In partial-trust situations, such as an application hosted on a network share, Try...Catch...Finally does not catch security exceptions that occur before the method that contains the call is invoked. Im folgenden Beispiel, wenn Sie es auf einer Serverfreigabe und von dort ausführen wird der Fehler "System.Security.SecurityException: Fehler bei der Anforderung."The following example, when you put it on a server share and run from there, produces the error "System.Security.SecurityException: Request Failed." Weitere Informationen zu Sicherheitsausnahmen führen, finden Sie unter den SecurityException Klasse.For more information about security exceptions, see the SecurityException class.

Try
    Process.Start("http://www.microsoft.com")
Catch ex As Exception
    MsgBox("Can't load Web page" & vbCrLf & ex.Message)
End Try

In einer solchen teilweise vertrauenswürdige Situation, muss die Process.Start Anweisung in einer separaten Sub.In such a partial-trust situation, you have to put the Process.Start statement in a separate Sub. Dem ersten Aufruf der Sub schlägt fehl.The initial call to the Sub will fail. Dies ermöglicht Try...Catch abzufangen, bevor Sie die Sub , enthält Process.Start gestartet wird und die Sicherheitsausnahme erzeugt.This enables Try...Catch to catch it before the Sub that contains Process.Start is started and the security exception produced.

BeispieleExamples

Die Struktur von Try... Catch... Zum SchlussThe structure of Try...Catch...Finally

Das folgende Beispiel veranschaulicht die Struktur der Try...Catch...Finally Anweisung.The following example illustrates the structure of the Try...Catch...Finally statement.

Public Sub TryExample()
    ' Declare variables.
    Dim x As Integer = 5
    Dim y As Integer = 0

    ' Set up structured error handling.
    Try
        ' Cause a "Divide by Zero" exception.
        x = x \ y

        ' This statement does not execute because program
        ' control passes to the Catch block when the
        ' exception occurs.
        MessageBox.Show("end of Try block")
    Catch ex As Exception
        ' Show the exception's message.
        MessageBox.Show(ex.Message)

        ' Show the stack trace, which is a list of methods
        ' that are currently executing.
        MessageBox.Show("Stack Trace: " & vbCrLf & ex.StackTrace)
    Finally
        ' This line executes whether or not the exception occurs.
        MessageBox.Show("in Finally block")
    End Try
End Sub

Ausnahme in einer Methode, die von einem Try-Block aufgerufenException in a method called from a Try block

Im folgenden Beispiel die CreateException -Methode löst eine NullReferenceException.In the following example, the CreateException method throws a NullReferenceException. Der Code, der die Ausnahme generiert befindet sich nicht in einem Try Block.The code that generates the exception is not in a Try block. Aus diesem Grund die CreateException Methode die Ausnahme nicht behandelt.Therefore, the CreateException method does not handle the exception. Die RunSample Methode die Ausnahme behandeln, da der Aufruf der CreateException -Methode wird in eine Try Block.The RunSample method does handle the exception because the call to the CreateException method is in a Try block.

Das Beispiel enthält Catch Anweisungen für mehrere Typen von Ausnahmen, sortiert, von der spezifischsten bis die allgemeinste.The example includes Catch statements for several types of exceptions, ordered from the most specific to the most general.

Public Sub RunSample()
    Try
        CreateException()
    Catch ex As System.IO.IOException
        ' Code that reacts to IOException.
    Catch ex As NullReferenceException
        MessageBox.Show("NullReferenceException: " & ex.Message)
        MessageBox.Show("Stack Trace: " & vbCrLf & ex.StackTrace)
    Catch ex As Exception
        ' Code that reacts to any other exception.
    End Try
End Sub

Private Sub CreateException()
    ' This code throws a NullReferenceException.
    Dim obj = Nothing
    Dim prop = obj.Name

    ' This code also throws a NullReferenceException.
    'Throw New NullReferenceException("Something happened.")
End Sub

Die Anweisung abfangen, wennThe Catch When statement

Das folgende Beispiel zeigt, wie Sie mit einem Catch When Anweisung, um nach einem bedingten Ausdruck zu filtern.The following example shows how to use a Catch When statement to filter on a conditional expression. Wenn der bedingte Ausdruck ergibt True, den Code in die Catch -Block ausgeführt.If the conditional expression evaluates to True, the code in the Catch block runs.

Private Sub WhenExample()
    Dim i As Integer = 5

    Try
        Throw New ArgumentException()
    Catch e As OverflowException When i = 5
        Console.WriteLine("First handler")
    Catch e As ArgumentException When i = 4
        Console.WriteLine("Second handler")
    Catch When i = 5
        Console.WriteLine("Third handler")
    End Try
End Sub
' Output: Third handler

Geschachtelte Try-AnweisungenNested Try statements

Das folgende Beispiel enthält eine Try…Catch in enthaltenen-Anweisung eine Try Block.The following example has a Try…Catch statement that is contained in a Try block. Die innere Catch Block löst eine Ausnahme aus, dessen InnerException -Eigenschaft auf die ursprüngliche Ausnahme festgelegt.The inner Catch block throws an exception that has its InnerException property set to the original exception. Die äußere Catch Block gibt, ihre eigene Ausnahme und der inneren Ausnahme.The outer Catch block reports its own exception and the inner exception.

Private Sub InnerExceptionExample()
    Try
        Try
            ' Set a reference to a StringBuilder.
            ' The exception below does not occur if the commented
            ' out statement is used instead.
            Dim sb As System.Text.StringBuilder
            'Dim sb As New System.Text.StringBuilder

            ' Cause a NullReferenceException.
            sb.Append("text")
        Catch ex As Exception
            ' Throw a new exception that has the inner exception
            ' set to the original exception.
            Throw New ApplicationException("Something happened :(", ex)
        End Try
    Catch ex2 As Exception
        ' Show the exception.
        Console.WriteLine("Exception: " & ex2.Message)
        Console.WriteLine(ex2.StackTrace)

        ' Show the inner exception, if one is present.
        If ex2.InnerException IsNot Nothing Then
            Console.WriteLine("Inner Exception: " & ex2.InnerException.Message)
            Console.WriteLine(ex2.StackTrace)
        End If
    End Try
End Sub

Für die Ausnahmebehandlung für asynchrone MethodenException handling for async methods

Im folgenden Beispiel wird die Ausnahmebehandlung für asynchrone Methoden veranschaulicht.The following example illustrates exception handling for async methods. Eine Ausnahme abfangen, die für eine asynchrone Aufgabe, gilt die Await Ausdruck ist einer Try Sperren des Aufrufers, und die Ausnahme ist aufgetreten, in der Catch Block.To catch an exception that applies to an async task, the Await expression is in a Try block of the caller, and the exception is caught in the Catch block.

Heben Sie die Auskommentierung der Zeile Throw New Exception im Beispiel auf, um die Ausnahmebehandlung zu veranschaulichen.Uncomment the Throw New Exception line in the example to demonstrate exception handling. Die Ausnahme abgefangen wird, der Catch blockieren, der Aufgabe IsFaulted -Eigenschaftensatz auf True, und der Aufgabe Exception.InnerException -Eigenschaftensatz auf die Ausnahme.The exception is caught in the Catch block, the task's IsFaulted property is set to True, and the task's Exception.InnerException property is set to the exception.

Heben Sie die Auskommentierung der Zeile Throw New OperationCancelledException auf, um zu veranschaulichen, was beim Abbrechen eines asynchronen Prozesses passiert.Uncomment the Throw New OperationCancelledException line to demonstrate what happens when you cancel an asynchronous process. Die Ausnahme abgefangen wird, der Catch Block und der Aufgabe IsCanceled -Eigenschaftensatz auf True.The exception is caught in the Catch block, and the task's IsCanceled property is set to True. Jedoch unter bestimmten Umständen, die nicht für dieses Beispiel gelten IsFaulted nastaven NA hodnotu True und IsCanceled nastaven NA hodnotu False.However, under some conditions that don't apply to this example, IsFaulted is set to True and IsCanceled is set to False.

Public Async Function DoSomethingAsync() As Task
    Dim theTask As Task(Of String) = DelayAsync()

    Try
        Dim result As String = Await theTask
        Debug.WriteLine("Result: " & result)
    Catch ex As Exception
        Debug.WriteLine("Exception Message: " & ex.Message)
    End Try

    Debug.WriteLine("Task IsCanceled: " & theTask.IsCanceled)
    Debug.WriteLine("Task IsFaulted:  " & theTask.IsFaulted)
    If theTask.Exception IsNot Nothing Then
        Debug.WriteLine("Task Exception Message: " &
            theTask.Exception.Message)
        Debug.WriteLine("Task Inner Exception Message: " &
            theTask.Exception.InnerException.Message)
    End If
End Function

Private Async Function DelayAsync() As Task(Of String)
    Await Task.Delay(100)

    ' Uncomment each of the following lines to
    ' demonstrate exception handling.

    'Throw New OperationCanceledException("canceled")
    'Throw New Exception("Something happened.")
    Return "Done"
End Function


' Output when no exception is thrown in the awaited method:
'   Result: Done
'   Task IsCanceled: False
'   Task IsFaulted:  False

' Output when an Exception is thrown in the awaited method:
'   Exception Message: Something happened.
'   Task IsCanceled: False
'   Task IsFaulted:  True
'   Task Exception Message: One or more errors occurred.
'   Task Inner Exception Message: Something happened.

' Output when an OperationCanceledException or TaskCanceledException
' is thrown in the awaited method:
'   Exception Message: canceled
'   Task IsCanceled: True
'   Task IsFaulted:  False

Behandeln von mehreren Ausnahmen in Async-MethodenHandling multiple exceptions in async methods

Das folgende Beispiel veranschaulicht die Behandlung von Ausnahmen in Fällen, in denen mehrere Aufgaben zu mehreren Ausnahmen führen können.The following example illustrates exception handling where multiple tasks can result in multiple exceptions. Die Try -Block ist die Await Ausdruck für die Aufgabe, die Task.WhenAll zurückgegeben.The Try block has the Await expression for the task that Task.WhenAll returned. Die Aufgabe abgeschlossen ist, bei der drei, auf die Aufgaben Task.WhenAll wird angewendet, abgeschlossen sind.The task is complete when the three tasks to which Task.WhenAll is applied are complete.

Jede der drei Aufgaben löst eine Ausnahme aus.Each of the three tasks causes an exception. Die Catch -Block iteriert durch die Ausnahmen, die im befinden die Exception.InnerExceptions Eigenschaft der Aufgabe, die Task.WhenAll zurückgegeben.The Catch block iterates through the exceptions, which are found in the Exception.InnerExceptions property of the task that Task.WhenAll returned.

Public Async Function DoMultipleAsync() As Task
    Dim theTask1 As Task = ExcAsync(info:="First Task")
    Dim theTask2 As Task = ExcAsync(info:="Second Task")
    Dim theTask3 As Task = ExcAsync(info:="Third Task")

    Dim allTasks As Task = Task.WhenAll(theTask1, theTask2, theTask3)

    Try
        Await allTasks
    Catch ex As Exception
        Debug.WriteLine("Exception: " & ex.Message)
        Debug.WriteLine("Task IsFaulted: " & allTasks.IsFaulted)
        For Each inEx In allTasks.Exception.InnerExceptions
            Debug.WriteLine("Task Inner Exception: " + inEx.Message)
        Next
    End Try
End Function

Private Async Function ExcAsync(info As String) As Task
    Await Task.Delay(100)

    Throw New Exception("Error-" & info)
End Function

' Output:
'   Exception: Error-First Task
'   Task IsFaulted: True
'   Task Inner Exception: Error-First Task
'   Task Inner Exception: Error-Second Task
'   Task Inner Exception: Error-Third Task

Siehe auchSee also