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

Proporciona un medio para controlar algunos o todos los errores posibles que pueden producirse 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  

ElementosParts

TérminoTerm DefiniciónDefinition
tryStatements Opcional.Optional. Instrucciones donde puede producirse un error.Statement(s) where an error can occur. Puede ser una instrucción compuesta.Can be a compound statement.
Catch Opcional.Optional. Varios Catch bloques permitido.Multiple Catch blocks permitted. Si se produce una excepción al procesar el Try bloquear, cada uno de ellos Catch instrucción se examina en orden textual para determinar si controla la excepción, con exception 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. Usar con Catch especificar el error detectado.Used with Catch to specify the error caught. Si se omite, el 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 queda enlazado 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. A Catch instrucción con un When cláusula detecta excepciones sólo cuando expression se evalúa como True.A Catch statement with a When clause catches exceptions only when expression evaluates to True. A When cláusula se aplica después de comprobar el tipo de la excepción, y expression pueden 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. Debe poder convertirse implícitamente al Boolean.Must be implicitly convertible to Boolean. Cualquier expresión que describe un filtro genérico.Any expression that describes a generic filter. Se utiliza normalmente para filtrar por número de error.Typically used to filter by error number. Usar con When palabra clave para especificar las circunstancias bajo las que se captura 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 asociado Try bloque.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 interrumpe fuera de la Try...Catch...Finally estructura.Keyword that breaks out of the Try...Catch...Finally structure. Reanuda la ejecución con el código que sigue inmediatamente el End Try instrucción.Execution resumes with the code immediately following the End Try statement. El Finally todavía se ejecutará la instrucción.The Finally statement will still be executed. No se permite en Finally bloques.Not allowed in Finally blocks.
Finally Opcional.Optional. A 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 una vez realizado el resto del procesamiento de error.Statement(s) that are executed after all other error processing has occurred.
End Try Finaliza el Try...Catch...Finally estructura.Terminates the Try...Catch...Finally structure.

ComentariosRemarks

Si espera que una excepción determinada podría producirse durante una sección concreta del código, coloque el código en un Try bloquear y usar un Catch bloque para mantener el control y controlar 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.

A Try…Catch instrucción consta de un Try bloque seguido de uno o más Catch cláusulas que especifican controladores para diferentes 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 un Try bloquear, Visual Basic busca el 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 una coincidencia Catch no se encontró la instrucción, Visual Basic examina el método que llamó al método actual, y así sucesivamente hasta 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 hay ningún Catch bloque se encuentra, Visual Basic se 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 un Try…Catch instrucción.You can use more than one Catch statement in a Try…Catch statement. Si lo hace, el orden de la Catch cláusulas es importante, ya que se examinan por 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.

El siguiente Catch condiciones de instrucción son las menos específicas y todas las capturará 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 bloquear el 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. Flujo de control nunca puede alcanzar un Catch bloque que sigue a 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 ningún exception variable, por ejemplo: CatchThe statement has no exception variable, for example: Catch

Cuando un Try…Catch…Finally instrucción está anidada en otro Try bloque, Visual Basic primero examina cada Catch instrucción interior Try bloque.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 hay coincidencia Catch se encuentra una instrucción, la búsqueda continúa en el Catch las instrucciones de la externa Try…Catch…Finally bloque.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 bloquearse porque trata de 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

El Try…Catch…Finally instrucción está disponible como un 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, Try Catch, propiedad, etceteray, 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, 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 se transfiere a la Finally bloquear justo antes de transferirlos fuera de la Try…Catch estructura.Control passes to the Finally block just before it passes out of the Try…Catch structure. Esto es cierto incluso si se produce una excepción en cualquier lugar 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 hay una excepción.A Finally block is useful for running any code that must execute even if there is an exception. El control pasa a la Finally bloque independientemente de cómo Try...Catch bloquear se cierra.Control is passed to the Finally block regardless of how the Try...Catch block exits.

El código en un Finally bloquear ejecuciones, incluso si el código encuentra una Return instrucción en un Try o Catch bloque.The code in a Finally block runs even if your code encounters a Return statement in a Try or Catch block. El control no pasar de un Try o Catch bloquear a los correspondientes Finally bloquear 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 para transferir explícitamente la ejecución en un Finally bloque.It is not valid to explicitly transfer execution into a Finally block. Transferir la ejecución de un Finally bloque no es válido, excepto a través de una excepción.Transferring execution out of a Finally block is not valid, except through an exception.

Si un Try instrucción no contiene al menos una 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, el Using instrucción se comporta como un Try…Finally bloque y garantiza la disposició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 cierto 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 bloque exception argumento 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. El Exception instancia de la clase que corresponde al error que se produjo en el Try bloque.The Exception class instance corresponds to the error that occurred in the Try block.

Las propiedades de la 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, el StackTrace listas de propiedades de los métodos llamados que produjeron la excepción, le ayuda a encontrar donde 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 devuelve el objeto que produjo la excepción actual, o Nothing si no hay 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 un bloque Try... Catch (instrucción)Considerations When Using a Try…Catch Statement

Use un Try…Catch instrucción solo para señalizar la aparición de eventos de programa inusuales o inesperados.Use a Try…Catch statement only to signal the occurrence of unusual or unanticipated program events. Razones para esto son 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 Catch bloque no se controla correctamente, la excepción no se puede notificar correctamente a los usuarios.If a Catch block is not handled correctly, the exception might not be reported correctly to users.

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

No necesita siempre un Try…Catch instrucción para comprobar una condición que es probable que suceda.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 en Catch bloques correctamente pueden notificar excepciones a los usuarios, ya sea a través de subprocesos registro 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 Async modificador, puede usar el Await operador 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 complete 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 la tarea que está asociada el Await operador finaliza, se reanuda la ejecución 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, consulte 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 terminar en un estado de error, que indica que ha completado 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. También puede finalizar una tarea en un estado cancelado, lo que resulta en una OperationCanceledException que se producen fuera 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 el Await expresión asociada a la tarea en un Try bloquear y detecte 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 encontrarse en un estado de error porque eran responsables de la cual varias excepciones.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 dicha tarea, la excepción detectada es solo una de las excepciones y no se puede predecir qué excepción se 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.

Un 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 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 utiliza un producen instrucción para devolver cada elemento de la colección a la vez.An iterator uses a Yield statement to return each element of the collection one at a time. Llamar a una función de iterador mediante un For Each... Next (instrucción).You call an iterator function by using a For Each...Next Statement.

A Yield instrucción puede estar dentro de un Try bloque.A Yield statement can be inside a Try block. A Try bloque que contiene un Yield instrucción puede tener Catch bloquea 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 "intente bloques en Visual Basic" de iteradores para obtener un ejemplo.See the "Try Blocks in Visual Basic" section of Iterators for an example.

A Yield instrucción no puede estar dentro de un Catch bloque o una 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 del iterador) produce una excepción, un Catch no se ejecuta el bloque de la función del iterador, pero un Finally se ejecuta el bloque de la función del 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 captura solo 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 excepciones de seguridad que se producen antes de invocar 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. El siguiente ejemplo, cuando se coloca en un recurso compartido de servidor y se ejecuta desde allí, genera el error "System.Security.SecurityException: error de 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 acerca de las excepciones de seguridad, consulte 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, tendrá que colocar el Process.Start instrucción en otro Sub.In such a partial-trust situation, you have to put the Process.Start statement in a separate Sub. La llamada inicial a la Sub se producirá un error.The initial call to the Sub will fail. Esto permite Try...Catch para detectar con anterioridad la Sub que contiene Process.Start se inicia y se produce 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.

EjemploExample

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

EjemploExample

En el ejemplo siguiente, la CreateException método produce un 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, la CreateException método no controla la excepción.Therefore, the CreateException method does not handle the exception. El RunSample método controlar la excepción porque la llamada a la 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.

El ejemplo incluye Catch instrucciones para varios tipos de excepciones, se ordenan desde el más específico al 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

EjemploExample

En el ejemplo siguiente se muestra cómo utilizar un Catch When instrucción para filtrar según 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, el código en el Catch bloquear ejecuciones.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

EjemploExample

El siguiente ejemplo tiene un 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. Interna Catch bloque produce una excepción que tenga 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 exterior Catch bloque informa acerca de 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

EjemploExample

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, el Await la expresión tiene un Try bloque del autor de la llamada 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. Se detectó la excepción en el Catch bloquear, la tarea IsFaulted propiedad está establecida en Truey la tarea Exception.InnerException propiedad 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. Se detectó la excepción en el Catch bloque y la tarea IsCanceled propiedad está establecida 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 son aplicables a este ejemplo, IsFaulted está establecido en True y IsCanceled está establecido 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

EjemploExample

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 el Await expresión para la tarea que Task.WhenAll devuelto.The Try block has the Await expression for the task that Task.WhenAll returned. La tarea está completa cuando las tres tareas a la que Task.WhenAll se aplica están completos.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 el Exception.InnerExceptions propiedad de la tarea que Task.WhenAll devuelto.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

Err
Exception
Exit (instrucción)Exit Statement
On Error (instrucción)On Error Statement
Procedimientos recomendados para usar fragmentos de códigoBest Practices for Using Code Snippets
Control de excepcionesException Handling
Throw (instrucción)Throw Statement