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

Esta instrucción proporciona una manera de controlar algunos o todos los errores posibles que pueden ocurrir en un bloque de código determinado mientras se ejecuta el código.

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

Partes

Término

Definición

tryStatements

Opcional. Instrucciones en las que puede ocurrir un error. Puede ser una instrucción compuesta.

Catch

Opcional. Se permite utilizar varios bloques Catch. Si se produce una excepción al procesar el bloque Try, cada instrucción Catch se examina en orden textual para determinar si controla la excepción; el parámetro exception representa la excepción que se ha producido.

exception

Opcional. Cualquier nombre de variable. El valor inicial de exception es el valor del error producido. Se utiliza con Catch para especificar la captura del error. Si se omite, la instrucción Catch detecta cualquier excepción.

type

Opcional. Especifica el tipo de filtro de clase. Si el valor de exception es del tipo especificado en type o de un tipo derivado, el identificador queda enlazado al objeto de excepción.

When

Opcional. Una instrucción Catch con una cláusula When sólo detecta las excepciones cuando expression se evalúa como True. Una cláusula When sólo se aplica después de comprobar el tipo de la excepción y expression puede hacer referencia al identificador que representa la excepción.

expression

Opcional. Debe ser convertible implícitamente a Boolean. Cualquier expresión que describe un filtro genérico. Se utiliza normalmente para filtrar por número de error. Se utiliza con la palabra clave When para especificar las circunstancias bajo las que se captura el error.

catchStatements

Opcional. Instrucciones para controlar los errores que se producen en el bloque Try asociado. Puede ser una instrucción compuesta.

Exit Try

Opcional. Palabra clave que interrumpe la ejecución de la estructura Try...Catch...Finally. La ejecución se reanuda con el código que sigue inmediatamente a la instrucción End Try. Se ejecutará la instrucción Finally todavía. No se permite en bloques Finally.

Finally

Opcional. Siempre se ejecuta un bloque Finally cuando la ejecución sale de cualquier parte de la instrucción Try...Catch.

finallyStatements

Opcional. Instrucciones que se ejecutan después de las demás operaciones de procesamiento de error.

End Try

Finaliza la estructura Try...Catch...Finally.

Comentarios

Si piensa que se puede producir una excepción determinada en una sección concreta del código, incluya éste en un bloque Try y utilice un bloque Catch para conservar el control y tratar la excepción que se produce.

Una instrucción Try…Catch consiste en un bloque Try seguido de una o más cláusulas Catch, que especifican controladores para varias excepciones. Cuando se produce una excepción en un bloque Try, Visual Basic busca la instrucción Catch que controla la excepción. Si no se encuentra una instrucción Catch coincidente, Visual Basic examina el método que llamó al método actual, y así sucesivamente hasta la pila de llamadas. Si no se encuentra ningún bloque Catch, Visual Basic muestra al usuario un mensaje de excepción no controlada y detiene la ejecución del programa.

Puede utilizar más de una instrucción Catch en una instrucción Try…Catch . Si lo hace, el orden de las cláusulas Catch es significativo debido a que se examinan en orden. Las excepciones más específicas se capturan antes que las menos específicas.

Las siguientes condiciones de la instrucción Catch son las menos específicas y detectarán todas las excepciones que se deriven de la clase Exception. Normalmente debe utilizar una de estas variaciones como el último bloque Catch de la estructura Try...Catch...Finally, después de detectar todas las excepciones específicas que espera. El flujo de control nunca puede alcanzar un bloque Catch situado detrás de cualquiera de estas variaciones.

  • El type es Exception, por ejemplo: Catch ex As Exception

  • La instrucción no tiene ninguna variable exception, por ejemplo: Catch

Cuando una instrucción Try…Catch…Finally está anidada en otro bloque Try, Visual Basic primero examina cada instrucción Catch en el bloque Try más interno. Si no encuentra ninguna instrucción Catch coincidente, la búsqueda continúa en las instrucciones Catch del bloque Try…Catch…Finally exterior.

Las variables locales de un bloque Try no se encuentran disponibles en un bloque Catch porque se trata de bloques independientes. Si se desea utilizar una variable en más de un bloque, se debe declarar la variable fuera de la estructura Try...Catch...Finally.

SugerenciaSugerencia

La instrucción Try…Catch…Finally está disponible como un fragmento de código de IntelliSense. En el Administrador de fragmentos de código, expanda Modelos de código - If, For Each, Try Catch, Property, etc, y Control de errores (excepciones). Para obtener más información, vea Cómo: Insertar fragmentos de código de IntelliSense.

Bloque Finally

Si tiene una o más instrucciones que se deben ejecutar antes de salir de la estructura Try, utilice un bloque Finally. El control pasa al bloque Finally justo antes de salir de la estructura Try…Catch. Esto se produce incluso si aparece una excepción dentro de la estructura Try.

Un bloque Finally es útil para ejecutar cualquier código que debe ejecutar incluso si hay una excepción. El control se pasa al bloque Finally independientemente de cómo se sale del bloque Try...Catch.

El código de un bloque Finally se ejecuta incluso si el código encuentra una instrucción Return en un bloque Try o Catch. El control no pasa de un bloque Try o Catch al bloque Finally correspondiente en los casos siguientes:

No es válido transferir explícitamente la ejecución a un bloque Finally. Tampoco es válido transferir la ejecución fuera de un bloque Finally salvo con una excepción.

Si una instrucción Try no contiene al menos un bloque Catch, debe contener un bloque Finally.

SugerenciaSugerencia

Si no tiene que detectar excepciones específicas, la instrucción Using se comporta como un bloque Try…Finally y garantiza la disposición de los recursos, independientemente de cómo salga del bloque. Esto es cierto incluso con una excepción no controlada. Para obtener más información, vea Using (Instrucción, Visual Basic).

Argumento de la excepción

El argumento exception del bloque Catch es una instancia de la clase Exception o una clase que se deriva de la clase Exception. La instancia de la clase Exception corresponde al error que se produjo en el bloque Try.

Las propiedades del objeto Exception ayudan a identificar la causa y la ubicación de una excepción. Por ejemplo, la propiedad StackTrace muestra una lista de los métodos llamados que generaron la excepción, lo que ayuda a detectar el lugar del código en el que ocurrió el error. Message devuelve un mensaje que describe la excepción. HelpLink devuelve un vínculo a un archivo de ayuda asociado. InnerException devuelve el objeto Exception que causó la excepción actual, o devuelve Nothing si no hay ninguna Exception original.

Consideraciones sobre cuándo utilizar una instrucción Try…Catch

Utilice una instrucción Try…Catch solo para indicar la ocurrencia de eventos de programa inusuales o imprevistos. Esto pasa por las siguientes razones:

  • Detectar excepciones en tiempo de ejecución crea sobrecarga adicional, y es probable que sea más lento que la comprobación previa para evitar excepciones.

  • Si un bloque Catch no se maneja correctamente, puede que no se informe correctamente a los usuarios acerca de la excepción.

  • El control de excepciones hace a un programa más complejo.

No siempre es necesario una instrucción Try…Catch para comprobar una condición que es probable que ocurra. El siguiente ejemplo comprueba si existe un archivo antes de intentar abrirlo. Esto reduce la necesidad de detectar una excepción iniciada por el método OpenText .

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 Catch puede informar correctamente de las excepciones a los usuarios, ya sea a través del registro seguro para subprocesos o de mensajes adecuados. De lo contrario, las excepciones podrían seguir siendo desconocidas.

Situaciones de confianza parcial

En situaciones de confianza parcial, como una aplicación hospedada en un recurso compartido de red, Try...Catch...Finally no detectará las excepciones de seguridad que se produzcan antes de llamar al método que contiene la llamada. El ejemplo siguiente, si se coloca en un recurso compartido de servidor y se ejecuta desde el mismo, producirá el error: "Sub System.Security.SecurityException: Error de solicitud". Para obtener más información sobre excepciones de seguridad, vea la clase SecurityException.

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

En este tipo de situación de confianza parcial, debe colocar la instrucción Process.Start en un procedimiento Sub independiente. La llamada inicial a Sub producirá un error. Esto permite que Try...Catch lo capture antes de que se inicie el procedimiento Sub que contiene Process.Start y se produzca la excepción de seguridad.

Ejemplo

El ejemplo siguiente muestra la estructura de la instrucción Try...Catch...Finally.

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

En el ejemplo siguiente, el método CreateException arroja una NullReferenceException. El código que genera la excepción no está en un bloque Try . Por lo tanto, el método CreateException no controla la excepción. El método RunSample no controla la excepción porque la llamada al método CreateException está en un bloque Try.

El ejemplo incluye instrucciones Catch para varios tipos de excepciones, ordenadas de la más específica a la más 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

En el ejemplo siguiente se muestra cómo utilizar una instrucción Catch When para filtrar una expresión condicional. Si la expresión condicional se evalúa a True, se ejecuta el código en el bloque Catch.

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

El ejemplo siguiente tiene una instrucción Try…Catch incluida en un bloque Try . El bloque Catch interior produce una excepción que tiene su propiedad InnerException establecida en la excepción original. El bloque exterior Catch informa de su propia excepción y de la excepción interna.

Private Sub InnerExceptionExample()
    Try
        Try
            ' Set a reference to a StringBuilder.
            ' The exception below does not occur if the commented
            ' 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

Vea también

Referencia

Err

Exit (Instrucción, Visual Basic)

Instrucción On Error (Visual Basic)

Exception

Throw (Instrucción, Visual Basic)

Conceptos

Procedimientos recomendados para utilizar fragmentos de código de IntelliSense

Control de excepciones (Task Parallel Library)

Otros recursos

Control estructurado de excepciones en Visual Basic

Historial de cambios

Fecha

Historial

Motivo

1 de abril de 2011

Reorganizado y añadido a observaciones, y ejemplos añadidos.

Mejora de la información.