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.
Sugerencia |
---|
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:
Se encuentra End (Instrucción) en el bloque Try o Catch.
Se produce StackOverflowException en el bloque Try o Catch.
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.
Sugerencia |
---|
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("https://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
Exit (Instrucción, Visual Basic)
Instrucción On Error (Visual Basic)
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. |