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

Proporciona una manera de controlar algunos o todos los posibles errores que pueden producirse en un bloque de código determinado, mientras se sigue ejecutando 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.

SyntaxSyntax

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 permiten Catch varios bloques.Multiple Catch blocks permitted. Si se produce una excepción al procesar el bloque, cada instrucción se examina en orden textual para determinar si controla la excepción, representando la excepción que se Try Catch ha exception 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 usa Catch con para especificar el error capturado.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 es del tipo especificado por o de un tipo derivado, el identificador se enlaza exception type 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 cláusula detecta When excepciones solo cuando se evalúa como expression True .A Catch statement with a When clause catches exceptions only when expression evaluates to True. Una cláusula solo se aplica después de comprobar el tipo de excepción y puede hacer referencia When al identificador que representa la expression 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. Debe poder convertirse 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 usa 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 Try asociado.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 se interrumpe en 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 todavía se ejecutará.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 sale de cualquier 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 resto del 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.

ComentariosRemarks

Si espera que se produzca una excepción determinada durante una sección determinada del código, coloque el código en un bloque y use un bloque para conservar el control y controlar la excepción si se Try Catch 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 bloque seguido de una o varias Try Catch cláusulas, que especifican controladores para varias 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 no se encuentra una instrucción de coincidencia, Visual Basic examina el método que llamó al método actual, y así sucesivamente Catch 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 se encuentra ningún bloque, Visual Basic muestra un mensaje de excepción no controlada al usuario y detiene Catch 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 instrucción Try…Catch .You can use more than one Catch statement in a Try…Catch statement. Si lo hace, el orden de las Catch cláusulas es significativo 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 condiciones Catch de instrucción siguientes 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 último bloque de la estructura, después de detectar todas las excepciones específicas Catch Try...Catch...Finally 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 nunca puede Catch alcanzar un bloque que siga cualquiera de estas variaciones.Control flow can never reach a Catch block that follows either of these variations.

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

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

Cuando una instrucción está anidada en otro bloque, Visual Basic primero Try…Catch…Finally examina cada instrucción del bloque más Try Catch Try interno.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 se encuentra ninguna instrucción que coincida, la búsqueda continúa con Catch las instrucciones del bloque Catch Try…Catch…Finally externo.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 Try un bloque no están disponibles en un bloque porque son Catch bloques independientes.Local variables from a Try block are not available in a Catch block because they are separate blocks. Si desea usar 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: If, For Each, Try 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 varias instrucciones que deben ejecutarse antes de salir de la Try estructura, use 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 se deba ejecutar incluso si hay 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 se cierre 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 instrucción en un bloque o Return Try 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 bloque o al bloque correspondiente en los Catch Finally 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 Finally de un 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 bloque Finally .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 instrucción se comporta como un bloque y garantiza la eliminación de los recursos, independientemente de cómo salga Using Try…Finally 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 argumento block es una instancia de la clase o una clase que deriva de la clase exception Exception Exception .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 corresponde al error que se produjo en el bloque Try .The Exception class instance corresponds to the error that occurred in the Try block.

Las propiedades del objeto Exception 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 propiedad enumera los métodos llamados que dieron lugar a la excepción, lo que ayuda a encontrar dónde StackTrace 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. Message devuelve un mensaje que describe la excepción.Message returns a message that describes the exception. HelpLink devuelve un vínculo a un archivo de Ayuda asociado.HelpLink returns a link to an associated Help file. InnerException devuelve el Exception objeto que produjo la excepción actual o devuelve Nothing si no hay ningún objeto Exception original.InnerException returns the Exception object that caused the current exception, or it returns Nothing if there is no original Exception.

Consideraciones al usar un try... Instrucción CatchConsiderations when using a Try…Catch statement

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

  • Detectar 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 bloque no se controla correctamente, es posible que la excepción no Catch se notime 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 necesita una instrucción Try…Catch 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 los bloques puede notificar correctamente las excepciones a los usuarios, ya sea mediante el registro seguro para Catch subprocesos o los 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, las excepciones pueden permanecer 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 operador , la ejecución Await 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 asincrónicos.For more information, see Control Flow in Async Programs.

Una tarea devuelta por un método asincrónico puede terminar 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 da como resultado que se produce una salida OperationCanceledException 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 expresión asociada a la tarea en un bloque y la excepción Await Try en el bloque Catch .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 estar en 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 va a capturar.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 bloque o Catch Finally bloque.An Await expression can't be inside a Catch block or Finally block.

IteratorsIterators

Una función de iterador o Get un accessor 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. Para llamar a una función de iterador, use for Each... Instrucción Next.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 instrucción puede tener Yield Catch bloques y puede tener un bloque Finally .A Try block that contains a Yield statement can have Catch blocks, and can have a Finally block. Consulte la sección "Try Blocks in Visual Basic" (Probar bloques en 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 bloque o un Catch Finally bloque.A Yield statement cannot be inside a Catch block or a Finally block.

Si el cuerpo (fuera de la función de iterador) produce una excepción, no se ejecuta un bloque de la función iterador, pero se ejecuta un bloque de la función For Each Catch de Finally 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 bloque dentro de una función de iterador detecta solo las Catch 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, no detecta las excepciones de seguridad que se producen antes de invocar el método que Try...Catch...Finally 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 produce el error "System.Security.SecurityException: Request Failed".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 esta situación de confianza parcial, tiene que colocar la Process.Start instrucción en un Sub independiente.In such a partial-trust situation, you have to put the Process.Start statement in a separate Sub. Se producirá un error en la llamada Sub inicial a .The initial call to the Sub will fail. Esto permite Try...Catch detectarlo antes de que Sub se inicia el que contiene y se produce la Process.Start 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

Estructura de Try... atrapar... FinalmenteThe 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, CreateException el método produce una NullReferenceException excepción .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, CreateException el 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 método está en un bloque CreateException Try .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

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 bloque Catch .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

En el ejemplo siguiente se Try…Catch incluye una instrucción que se encuentra en un bloque Try .The following example has a Try…Catch statement that is contained in a Try block. El bloque Catch 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 bloque Catch 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 expresión está en un bloque del autor de la llamada y la excepción se Await detecta en el bloque Try Catch .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 bloque , la propiedad de la tarea se establece en y la propiedad de la tarea se Catch IsFaulted establece en la True Exception.InnerException 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 Catch el bloque y la propiedad de la tarea se establece en IsCanceled 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, se IsFaulted establece en y se establece en True IsCanceled 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

Control de 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 expresión para la tarea Await Task.WhenAll devuelta.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 Task.WhenAll que 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 propiedad de la tarea Exception.InnerExceptions Task.WhenAll devuelta.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

Vea tambiénSee also