Instrucción Try...Catch...Finally (Visual Basic)Try...Catch...Finally Statement (Visual Basic)

Proporciona una manera de controlar algunos o todos los errores posibles que se pueden producir en un bloque de código determinado, mientras se sigue ejecutando el código.Provides a way to handle some or all possible errors that may occur in a given block of code, while still running code.

SintaxisSyntax

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

PartesParts

TérminoTerm DefiniciónDefinition
tryStatements Opcional.Optional. Instrucciones en las que se puede producir un error.Statement(s) where an error can occur. Puede ser una instrucción compuesta.Can be a compound statement.
Catch Opcional.Optional. Se Catch permiten varios bloques.Multiple Catch blocks permitted. Si se produce una excepción al procesar el Try bloque, cada Catch instrucción se examina en orden textual para determinar si controla la excepción, con exception lo que representa la excepción que se ha producido.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 Opcional.Optional. Cualquier nombre de variable.Any variable name. El valor inicial de exception es el valor del error producido.The initial value of exception is the value of the thrown error. Se utiliza con Catch para especificar el error detectado.Used with Catch to specify the error caught. Si se omite, la Catch instrucción detecta cualquier excepción.If omitted, the Catch statement catches any exception.
type Opcional.Optional. Especifica el tipo de filtro de clase.Specifies the type of class filter. Si el valor de exception es del tipo especificado por type o de un tipo derivado, el identificador se enlaza al objeto de excepción.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 Opcional.Optional. Una Catch instrucción con una When cláusula solo detecta las excepciones cuando expression se evalúa como True .A Catch statement with a When clause catches exceptions only when expression evaluates to True. Una When cláusula solo se aplica después de comprobar el tipo de la excepción y expression puede hacer referencia al identificador que representa la excepción.A When clause is applied only after checking the type of the exception, and expression may refer to the identifier representing the exception.
expression Opcional.Optional. Se debe poder convertir implícitamente en Boolean .Must be implicitly convertible to Boolean. Cualquier expresión que describa un filtro genérico.Any expression that describes a generic filter. Normalmente se usa para filtrar por número de error.Typically used to filter by error number. Se utiliza con When la palabra clave para especificar las circunstancias en las que se detecta el error.Used with When keyword to specify circumstances under which the error is caught.
catchStatements Opcional.Optional. Instrucciones para controlar los errores que se producen en el bloque asociado Try .Statement(s) to handle errors that occur in the associated Try block. Puede ser una instrucción compuesta.Can be a compound statement.
Exit Try Opcional.Optional. Palabra clave que sale de la Try...Catch...Finally estructura.Keyword that breaks out of the Try...Catch...Finally structure. La ejecución se reanuda con el código inmediatamente después de la End Try instrucción.Execution resumes with the code immediately following the End Try statement. La Finally instrucción se seguirá ejecutando.The Finally statement will still be executed. No se permite en Finally bloques.Not allowed in Finally blocks.
Finally Opcional.Optional. Un Finally bloque siempre se ejecuta cuando la ejecución deja parte de la Try...Catch instrucción.A Finally block is always executed when execution leaves any part of the Try...Catch statement.
finallyStatements Opcional.Optional. Instrucciones que se ejecutan después de que se haya producido el otro procesamiento de errores.Statement(s) that are executed after all other error processing has occurred.
End Try Finaliza la Try...Catch...Finally estructura.Terminates the Try...Catch...Finally structure.

ObservacionesRemarks

Si espera que se produzca una excepción determinada durante una sección de código determinada, coloque el código en un Try bloque y use un Catch bloque para conservar el control y controle la excepción si se produce.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.

Una Try…Catch instrucción consta de un Try bloque seguido de una o más Catch cláusulas, que especifican Controladores para distintas excepciones.A Try…Catch statement consists of a Try block followed by one or more Catch clauses, which specify handlers for various exceptions. Cuando se produce una excepción en un Try bloque, Visual Basic busca la Catch instrucción que controla la excepción.When an exception is thrown in a Try block, Visual Basic looks for the Catch statement that handles the exception. Si Catch no se encuentra una instrucción coincidente, Visual Basic examina el método que llamó al método actual, y así sucesivamente en la pila de llamadas.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. Si no Catch se encuentra ningún bloque, Visual Basic muestra al usuario un mensaje de excepción no controlada y detiene la ejecución del programa.If no Catch block is found, Visual Basic displays an unhandled exception message to the user and stops execution of the program.

Puede usar más de una Catch instrucción en una Try…Catch instrucción.You can use more than one Catch statement in a Try…Catch statement. Si lo hace, el orden de las Catch cláusulas es importante porque se examinan en orden.If you do this, the order of the Catch clauses is significant because they are examined in order. Detectar las excepciones más específicas antes que las menos específicas.Catch the more specific exceptions before the less specific ones.

Las siguientes Catch condiciones de instrucción son las menos específicas y detectarán todas las excepciones que derivan de la Exception clase.The following Catch statement conditions are the least specific, and will catch all exceptions that derive from the Exception class. Normalmente, debe usar una de estas variaciones como el último Catch bloque de la Try...Catch...Finally estructura, después de detectar todas las excepciones específicas que espera.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. El flujo de control no puede llegar nunca a un Catch bloque que siga cualquiera de estas variaciones.Control flow can never reach a Catch block that follows either of these variations.

  • El type es Exception , por ejemplo:Catch ex As ExceptionThe type is Exception, for example: Catch ex As Exception

  • La instrucción no tiene ninguna exception variable, por ejemplo:CatchThe statement has no exception variable, for example: Catch

Cuando una Try…Catch…Finally instrucción está anidada en otro Try bloque, Visual Basic examina primero cada Catch instrucción en el bloque más interno Try .When a Try…Catch…Finally statement is nested in another Try block, Visual Basic first examines each Catch statement in the innermost Try block. Si no Catch se encuentra ninguna instrucción coincidente, la búsqueda continúa con las Catch instrucciones del bloque exterior Try…Catch…Finally .If no matching Catch statement is found, the search proceeds to the Catch statements of the outer Try…Catch…Finally block.

Las variables locales de un Try bloque no están disponibles en un Catch bloque porque son bloques independientes.Local variables from a Try block are not available in a Catch block because they are separate blocks. Si desea utilizar una variable en más de un bloque, declare la variable fuera de la Try...Catch...Finally estructura.If you want to use a variable in more than one block, declare the variable outside the Try...Catch...Finally structure.

Sugerencia

La Try…Catch…Finally instrucción está disponible como fragmento de código de IntelliSense.The Try…Catch…Finally statement is available as an IntelliSense code snippet. En el administrador de fragmentos de código, expanda patrones de código: Si, para cada uno, pruebe Catch, Property, etc. y, a continuación, control de errores (excepciones).In the Code Snippets Manager, expand Code Patterns - If, For Each, Try Catch, Property, etc, and then Error Handling (Exceptions). Para obtener más información, vea Fragmentos de código.For more information, see Code Snippets.

Bloque FinallyFinally block

Si tiene una o más instrucciones que se deben ejecutar antes de salir de la Try estructura, utilice un Finally bloque.If you have one or more statements that must run before you exit the Try structure, use a Finally block. El control pasa al Finally bloque justo antes de salir de la Try…Catch estructura.Control passes to the Finally block just before it passes out of the Try…Catch structure. Esto es así incluso si se produce una excepción en cualquier parte dentro de la Try estructura.This is true even if an exception occurs anywhere inside the Try structure.

Un Finally bloque es útil para ejecutar cualquier código que deba ejecutarse incluso si se produce una excepción.A Finally block is useful for running any code that must execute even if there is an exception. El control se pasa al Finally bloque independientemente de cómo Try...Catch salga el bloque.Control is passed to the Finally block regardless of how the Try...Catch block exits.

El código de un Finally bloque se ejecuta incluso si el código encuentra una Return instrucción en un Try bloque o Catch .The code in a Finally block runs even if your code encounters a Return statement in a Try or Catch block. El control no pasa de un Try Catch bloque o al bloque correspondiente Finally en los casos siguientes:Control does not pass from a Try or Catch block to the corresponding Finally block in the following cases:

No es válido transferir explícitamente la ejecución a un Finally bloque.It is not valid to explicitly transfer execution into a Finally block. La transferencia de la ejecución fuera de un Finally bloque no es válida, excepto a través de una excepción.Transferring execution out of a Finally block is not valid, except through an exception.

Si una Try instrucción no contiene al menos un Catch bloque, debe contener un Finally bloque.If a Try statement does not contain at least one Catch block, it must contain a Finally block.

Sugerencia

Si no tiene que detectar excepciones específicas, la Using instrucción se comporta como un Try…Finally bloque y garantiza la eliminación de los recursos, independientemente de cómo salga del bloque.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. Esto es así incluso con una excepción no controlada.This is true even with an unhandled exception. Para obtener más información, vea using (instrucción).For more information, see Using Statement.

Argumento de excepciónException argument

El Catch exception argumento de bloque es una instancia de la Exception clase o una clase que deriva de la Exception clase.The Catch block exception argument is an instance of the Exception class or a class that derives from the Exception class. La Exception instancia de clase se corresponde con el error que se produjo en el Try bloque.The Exception class instance corresponds to the error that occurred in the Try block.

Las propiedades del Exception objeto ayudan a identificar la causa y la ubicación de una excepción.The properties of the Exception object help to identify the cause and location of an exception. Por ejemplo, la StackTrace propiedad enumera los métodos a los que se ha provocado la excepción, lo que le ayuda a encontrar el lugar en el que se produjo el error en el código.For example, the StackTrace property lists the called methods that led to the exception, helping you find where the error occurred in the code. MessageDevuelve un mensaje que describe la excepción.Message returns a message that describes the exception. HelpLinkDevuelve un vínculo a un archivo de ayuda asociado.HelpLink returns a link to an associated Help file. InnerExceptionDevuelve el Exception objeto que causó la excepción actual, o devuelve si no hay Nothing ningún original Exception .InnerException returns the Exception object that caused the current exception, or it returns Nothing if there is no original Exception.

Consideraciones al usar una instrucción try... Catch (instrucción)Considerations when using a Try…Catch statement

Use una Try…Catch instrucción solo para indicar la aparición de eventos de programa inusuales o imprevistos.Use a Try…Catch statement only to signal the occurrence of unusual or unanticipated program events. Entre los motivos se incluyen los siguientes:Reasons for this include the following:

  • La detección de excepciones en tiempo de ejecución crea una sobrecarga adicional y es probable que sea más lenta que la comprobación previa para evitar excepciones.Catching exceptions at runtime creates additional overhead, and is likely to be slower than pre-checking to avoid exceptions.

  • Si un Catch bloque no se controla correctamente, es posible que la excepción no se notifique correctamente a los usuarios.If a Catch block is not handled correctly, the exception might not be reported correctly to users.

  • El control de excepciones hace que un programa sea más complejo.Exception handling makes a program more complex.

No siempre se necesita una Try…Catch instrucción para comprobar si hay una condición que es probable que se produzca.You do not always need a Try…Catch statement to check for a condition that is likely to occur. En el ejemplo siguiente se comprueba si existe un archivo antes de intentar abrirlo.The following example checks whether a file exists before trying to open it. Esto reduce la necesidad de detectar una excepción producida por el OpenText método.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

Asegúrese de que el código de Catch los bloques pueda notificar correctamente las excepciones a los usuarios, ya sea a través de registros seguros para subprocesos o mensajes adecuados.Ensure that code in Catch blocks can properly report exceptions to users, whether through thread-safe logging or appropriate messages. De lo contrario, es posible que las excepciones sigan siendo desconocidas.Otherwise, exceptions might remain unknown.

Métodos asincrónicosAsync methods

Si marca un método con el modificador Async , puede usar el operador Await en el método.If you mark a method with the Async modifier, you can use the Await operator in the method. Una instrucción con el Await operador suspende la ejecución del método hasta que se completa la tarea esperada.A statement with the Await operator suspends execution of the method until the awaited task completes. La tarea representa el trabajo en curso.The task represents ongoing work. Cuando finaliza la tarea asociada al Await operador, la ejecución se reanuda en el mismo método.When the task that's associated with the Await operator finishes, execution resumes in the same method. Para obtener más información, vea flujo de control en programas Async.For more information, see Control Flow in Async Programs.

Una tarea devuelta por un método asincrónico puede finalizar en un estado de error, lo que indica que se completó debido a una excepción no controlada.A task returned by an Async method may end in a faulted state, indicating that it completed due to an unhandled exception. Una tarea también puede terminar en un estado cancelado, lo que provoca que OperationCanceledException se produzca una excepción de la expresión Await.A task may also end in a canceled state, which results in an OperationCanceledException being thrown out of the await expression. Para detectar cualquier tipo de excepción, coloque la Await expresión que está asociada a la tarea en un Try bloque y Capture la excepción en el Catch bloque.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. Más adelante en este tema se proporciona un ejemplo.An example is provided later in this topic.

Una tarea puede tener un estado de error porque varias excepciones eran responsables de su error.A task can be in a faulted state because multiple exceptions were responsible for its faulting. Por ejemplo, la tarea podría ser el resultado de una llamada a Task.WhenAll.For example, the task might be the result of a call to Task.WhenAll. Cuando espera una tarea de este tipo, la excepción detectada es solo una de las excepciones y no puede predecir qué excepción se detectará.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. Más adelante en este tema se proporciona un ejemplo.An example is provided later in this topic.

Una Await expresión no puede estar dentro de un Catch bloque o Finally bloque.An Await expression can't be inside a Catch block or Finally block.

IteratorsIterators

Una función de iterador o un Get descriptor de acceso realiza una iteración personalizada en una colección.An iterator function or Get accessor performs a custom iteration over a collection. Un iterador usa una instrucción yield para devolver cada elemento de la colección de uno en uno.An iterator uses a Yield statement to return each element of the collection one at a time. Se llama a una función de iterador mediante un método for each... Instrucción siguiente.You call an iterator function by using a For Each...Next Statement.

Una Yield instrucción puede estar dentro de un Try bloque.A Yield statement can be inside a Try block. Un Try bloque que contiene una Yield instrucción puede tener Catch bloques y puede tener un Finally bloque.A Try block that contains a Yield statement can have Catch blocks, and can have a Finally block. Vea la sección "Try blocks in Visual Basic" de iteradores para obtener un ejemplo.See the "Try Blocks in Visual Basic" section of Iterators for an example.

Una Yield instrucción no puede estar dentro de un Catch bloque o un Finally bloque.A Yield statement cannot be inside a Catch block or a Finally block.

Si el For Each cuerpo (fuera de la función de iterador) produce una excepción, Catch no se ejecuta un bloque de la función de iterador, pero Finally se ejecuta un bloque en la función de iterador.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. Un Catch bloque dentro de una función de iterador solo detecta las excepciones que se producen dentro de la función de iterador.A Catch block inside an iterator function catches only exceptions that occur inside the iterator function.

Situaciones de confianza parcialPartial-trust situations

En situaciones de confianza parcial, como una aplicación hospedada en un recurso compartido de red, Try...Catch...Finally no detecta las excepciones de seguridad que se producen antes de que se invoque el método que contiene la llamada.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. En el ejemplo siguiente, cuando se coloca en un recurso compartido de servidor y se ejecuta desde allí, se genera el error "System. Security. SecurityException: error en la solicitud."The following example, when you put it on a server share and run from there, produces the error "System.Security.SecurityException: Request Failed." Para obtener más información sobre las excepciones de seguridad, vea la SecurityException clase.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

En una situación de confianza parcial, debe colocar la Process.Start instrucción en un independiente Sub .In such a partial-trust situation, you have to put the Process.Start statement in a separate Sub. SubSe producirá un error en la llamada inicial a.The initial call to the Sub will fail. Esto permite Try...Catch que se detecte antes de Sub que Process.Start se inicie el que contiene y se produzca la excepción de seguridad.This enables Try...Catch to catch it before the Sub that contains Process.Start is started and the security exception produced.

EjemplosExamples

La estructura de try... Detectar... TerminarThe structure of Try...Catch...Finally

En el ejemplo siguiente se muestra la estructura de la Try...Catch...Finally instrucción.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

Excepción en un método llamado desde un bloque tryException in a method called from a Try block

En el ejemplo siguiente, el CreateException método produce una excepción NullReferenceException .In the following example, the CreateException method throws a NullReferenceException. El código que genera la excepción no está en un Try bloque.The code that generates the exception is not in a Try block. Por lo tanto, el CreateException método no controla la excepción.Therefore, the CreateException method does not handle the exception. El RunSample método controla la excepción porque la llamada al CreateException método está en un Try bloque.The RunSample method does handle the exception because the call to the CreateException method is in a Try block.

En el ejemplo Catch se incluyen instrucciones para varios tipos de excepciones, ordenadas de la más específica a la más general.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

La instrucción Catch WhenThe Catch When statement

En el ejemplo siguiente se muestra cómo usar una Catch When instrucción para filtrar por una expresión condicional.The following example shows how to use a Catch When statement to filter on a conditional expression. Si la expresión condicional se evalúa como True , se ejecuta el código del Catch bloque.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

Instrucciones try anidadasNested Try statements

El ejemplo siguiente tiene una Try…Catch instrucción que se encuentra en un Try bloque.The following example has a Try…Catch statement that is contained in a Try block. El Catch bloque interno produce una excepción que tiene su InnerException propiedad establecida en la excepción original.The inner Catch block throws an exception that has its InnerException property set to the original exception. El Catch bloque externo notifica su propia excepción y la excepción interna.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

Control de excepciones para métodos asincrónicosException handling for async methods

En el ejemplo siguiente se muestra el control de excepciones de los métodos asincrónicos.The following example illustrates exception handling for async methods. Para detectar una excepción que se aplica a una tarea asincrónica, la Await expresión se encuentra en un Try bloque del llamador y la excepción se captura en el Catch bloque.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.

Quite la marca de comentario de la línea Throw New Exception en el ejemplo para demostrar el control de excepciones.Uncomment the Throw New Exception line in the example to demonstrate exception handling. La excepción se detecta en el Catch bloque, la propiedad de la tarea IsFaulted se establece en True y la propiedad de la tarea Exception.InnerException se establece en la excepción.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.

Quite la marca de comentario de la línea Throw New OperationCancelledException para ver lo que pasa cuando se cancela un proceso asincrónico.Uncomment the Throw New OperationCancelledException line to demonstrate what happens when you cancel an asynchronous process. La excepción se detecta en el Catch bloque y la propiedad de la tarea IsCanceled se establece en True .The exception is caught in the Catch block, and the task's IsCanceled property is set to True. Sin embargo, en algunas condiciones que no se aplican a este ejemplo, IsFaulted se establece en True y IsCanceled se establece en 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

Controlar varias excepciones en métodos asincrónicosHandling multiple exceptions in async methods

En el ejemplo siguiente se muestra el control de excepciones en el que varias tareas pueden producir varias excepciones.The following example illustrates exception handling where multiple tasks can result in multiple exceptions. El Try bloque tiene la Await expresión de la tarea que Task.WhenAll devolvió.The Try block has the Await expression for the task that Task.WhenAll returned. La tarea se completa cuando se completan las tres tareas a las que Task.WhenAll se aplica.The task is complete when the three tasks to which Task.WhenAll is applied are complete.

Cada una de las tres tareas produce una excepción.Each of the three tasks causes an exception. El Catch bloque recorre en iteración las excepciones, que se encuentran en la Exception.InnerExceptions propiedad de la tarea que Task.WhenAll devolvió.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

Consulte tambiénSee also