La interceptación y el tratamiento de excepciones son tareas estándar de programación.
En este artículo se explica cómo utilizar un bloque
try-catch-finally
para interceptar una excepción. Un bloque
try-catch-finally
es un
contenedor que se pone alrededor del código donde es posible que se produzca una excepción.
Un bloque
try-catch-finally
consta de las secciones siguientes:
- Todo el código que puede iniciar una excepción se pone dentro del bloque
try
. - Si se inicia una excepción se entra en el bloque
catch
y el programa puede realizar la operación apropiada de recuperación o avisar al usuario. - El código del bloque
finally
se ejecuta siempre y puede realizar una limpieza después de producirse una excepción. El bloque finally
es opcional.
Cómo interceptar excepciones en Visual Basic .NET
- Cree una nueva aplicación de consola en Visual Basic .NET.
- En el procedimiento
Sub Main()
, inserte el ejemplo de código siguiente. En el ejemplo se declara e inicializa tres variables, donde la inicialización de "k" produce un error:
' Este código genera una excepción.
Console.WriteLine("Vamos a dividir 10 entre 0 y ver lo que ocurre...")
Console.WriteLine()
Dim i as Integer = 10
Dim j as Integer = 0
Dim k As Integer k = i/j ' Error en esta línea.
- Presione la tecla F5 para ver la excepción.
- Ponga una instrucción
try-catch
alrededor del código para capturar el error. El código siguiente intercepta todos los errores iniciados en el código y muestra un mensaje de error genérico. Reemplace el código del procedimiento Sub Main()
por el código siguiente:
' Este código muestra cómo interceptar una excepción.
Try
Console.WriteLine("Vamos a dividir 10 entre 0 y ver lo que ocurre...")
Console.WriteLine()
Dim i as Integer = 10
Dim j as Integer = 0
Dim k As Integer k = i/j ' Error en esta línea. El control pasa al bloque catch.
Catch
Console.WriteLine("Error.")
End Try
- Presione CTRL+F5 para ejecutar el proyecto. Observe que aparecerá el mensaje de error del bloque
catch
. - Si es preciso realizar alguna tarea de limpieza o postproceso independientemente de que se produzca o no un error, utilice la parte
finally
de la instrucción try-catch-finally
. El código de la parte finally
de la instrucción se ejecuta siempre, independientemente de que haya o no una excepción. En la consola aparecerá el código siguiente, "Esta instrucción se imprime siempre", aunque no aparezca ningún error. Reemplace el código de Sub Main()
por el código siguiente:
' Este código muestra cómo interceptar una excepción.
Try
Console.WriteLine("Vamos a dividir 10 entre 0 y ver lo que ocurre...")
Console.WriteLine()
Dim i as Integer = 10
Dim j as Integer = 0
Dim k As Integer k = i/j ' Error en esta línea. El control pasa al bloque catch.
Catch
Console.WriteLine("Error.")
Finally ' Esta sección se ejecuta independientemente del proceso anterior.
Console.WriteLine()
Console.WriteLine("Esta instrucción se imprime siempre")
End Try
- Presione CTRL+F5 para ejecutar el proyecto.
- Puede utilizar el objeto de excepción con la instrucción
catch
para recuperar detalles acerca de la excepción. Una excepción tiene varias propiedades que pueden ayudarle a identificar información de ayuda, origen o incluso pila acerca de una excepción. Esta información puede ser muy útil para hacer un seguimiento de la causa original de la excepción o para proporcionar una explicación mejor de su origen. El ejemplo siguiente intercepta una excepción y muestra un mensaje de error específico. Como antes, puede reemplazar el código del procedimiento Sub Main()
por el código siguiente:
Ejemplo 1:
' Este código muestra cómo interceptar una excepción.
Try
Console.WriteLine("Vamos a dividir 10 entre 0 y ver lo que ocurre...")
Console.WriteLine()
Dim i as Integer = 10
Dim j as Integer = 0
Dim k As Integer k = i/j ' Error en esta línea. El control pasa al bloque catch.
Catch e As Exception ' Ejecuta código que trata la excepción
' o informa al usuario de lo que ha ocurrido.
Console.WriteLine("Error:")
Console.WriteLine(e.ToString()) ' Muestra el mensaje de error al usuario.
Finally ' Esta sección se ejecuta independientemente del proceso anterior.
Console.WriteLine()
Console.WriteLine("Esta instrucción se imprime siempre")
End Try
Ejemplo 2:
' Este código muestra cómo interceptar una excepción.
Try
Console.WriteLine("Vamos a dividir 10 entre 0 y ver lo que ocurre...")
Console.WriteLine()
Dim i as Integer = 10
Dim j as Integer = 0
Dim k As Integer k = i/j ' Error en esta línea. El control pasa al bloque catch.
Catch e As Exception ' Ejecuta código que trata la excepción
' o informa al usuario de lo que ha ocurrido.
Console.WriteLine("Error:")
Console.WriteLine( e.Message ) ' Imprime el mensaje de error.
Console.WriteLine( e.Source ) ' Nombre de la aplicación o del objeto
' que produjo el error
Console.WriteLine( e.StackTrace ) ' Cadena que contiene el seguimiento
' de la pila para esta excepción
Finally ' Esta sección se ejecuta independientemente del proceso anterior.
Console.WriteLine()
Console.WriteLine("Esta instrucción se imprime siempre")
End Try
- Hasta este momento ha tratado el caso concreto de una excepción no específica. Sin embargo, si sabe de antemano qué tipo de excepción va a ocurrir, puede interceptar la excepción anticipada y procesarla en consecuencia. Entonces puede interceptar todas las demás excepciones y tratarlas. En el ejemplo siguiente se demuestra esto:
' Vamos a intentar realizar cierto procesamiento de archivos.
' Esto puede ocasionar varias excepciones posibles.
' Tenga en cuenta que puede utilizar determinadas excepciones para obtener información
' adicional acerca de la excepción, pero este ejemplo se centra en mostrar la ejecución
' de control para dichas excepciones.
Try
File.Create("c:/temp/test.txt") ' Puede fracasar por diversos motivos
Catch ioe As System.IO.IOException ' Este error puede ocurrir si la carpeta Temp no existe.
Console.WriteLine("Error de E/S. La carpeta c:\temp no existe")
Catch se As System.Security.SecurityException ' No tiene el permiso apropiado para
' realizar esta acción.
Console.WriteLine("No tiene los permisos de seguridad para realizar esta acción.")
Catch e As Exception ' Interceptar todas las demás excepciones.
Console.WriteLine( e.ToString() ) ' Imprimir la información de excepción estándar.
End Try
Como las configuraciones de los equipos pueden ser diferentes, puede que el ejemplo de este paso inicie o no una excepción. Si desea forzar una excepción de E/S, cambie la ruta de acceso a una carpeta que no exista en el equipo.