Manipulación estructurada de errores

Manipulación estructurada de errores

En este tipo de tratamiento, cada vez que se produce un error, se genera un objeto de la clase Exception o alguna de sus derivadas, conteniendo la información del error ocurrido. La manera de capturar este tipo de objetos pasa por utilizar una estructura de control del lenguaje, proporcionada para esta finalidad.

La estructura Try...End Try

Esta estructura de control del lenguaje, proporciona el medio para definir un bloque de código sensible

a errores, y los correspondientes manipuladores de excepciones, en función del tipo de error producido. El Código fuente 391 muestra su sintaxis.

Try ' código que puede provocar errores ' .... ' ....

[Catch [Excepcion [As TipoExcepcionA]] [When Expresión] ' respuesta a error de tipo A ' .... ' .... [Exit Try]

[Catch [Excepcion [As TipoExcepcionN]] [When Expresión] ' respuesta a error de tipo N ' .... ' .... [Exit Try]

[Finally ' código posterior al control de errores

Programación con Visual Basic .NET © Grupo EIDOS

' .... ' ....

End Try

Código fuente 391

Analicemos con detalle los principales elementos de esta estructura. En primer lugar nos encontramos con su declaración mediante la palabra clave Try. Todo el código

que escribimos a partir de dicha palabra clave, y hasta la primera sentencia Catch, es el código que definimos como sensible a errores, o dicho de otro modo, el bloque de instrucciones sobre las que deseamos que se active el control de errores cuando se produzca algún fallo en su ejecución.

A continuación, establecemos cada uno de los manipuladores de excepción mediante la palabra clave Catch. Junto a esta palabra clave, situaremos de forma opcional, un identificador que contendrá el objeto con la excepción generada. Finalmente, y también de modo opcional, con la palabra clave When, especificaremos una condición para la captura del objeto de excepción. Podemos escribir uno o varios manipuladores Catch dentro de una estructura de control Try...End Try.

Cada vez que se produzca un error, el flujo de la ejecución saltará a la sentencia Catch más acorde con el tipo de excepción generada por el error, siempre y cuando hayamos situado varios manipuladores de excepciones en el controlador de errores.

Tal y como acaba de ver el lector en la sintaxis de la estructura Try...End Try, es posible utilizar Catch

de un modo genérico, es decir, sin establecer qué tipo de excepción se ha producido. Este es el tipo de control de errores más sencillo que podemos implementar, aunque también el más limitado, ya que sólo podemos tener un manipulador de excepciones. Veamos un ejemplo en el Código fuente 392.

Public Sub Main() Dim sValor As String Dim iNumero As Integer

Try ' comienza el control de errores Console.WriteLine("Introducir un número") sValor = Console.ReadLine() ' si no hemos introducido un número... iNumero = sValor ' ...aquí se producirá un error...

' ...y no llegaremos a esta parte del código iNumero = iNumero + 1000

Catch ' si se produce un error, se genera una excepción ' que capturamos en este bloque de código ' manipulador de excepción, definido por Catch Console.WriteLine("Error al introducir el número" & _

ControlChars.CrLf & _ "El valor {0} es incorrecto", _ sValor)

End Try

' resto del código del procedimiento ' .... Console.ReadLine()

© Grupo EIDOS 26. Manipulación de errores

End Sub

Código fuente 392

Tanto si se produce un error como si no, la sentencia Finally de la estructura Try...End Try, nos permite escribir un bloque de código que será ejecutado al darse una condición de error, o bajo ejecución normal del procedimiento.

El Código fuente 393 muestra el mismo ejemplo anterior, pero introduciendo un bloque Finally. Pruebe el lector alternativamente, a forzar un error, y a ejecutar sin errores este fuente; en ambos casos verá que el bloque Finally es ejecutado. Para completar el ejemplo, tras la estructura Try...End Try se han escrito varias líneas de código potencialmente problemáticas; en el caso de que se produzca un error, la ejecución será cancelada, al no estar dichas líneas situadas en un controlador de errores.

Public Sub Main() Dim sValor As String Dim iNumero As Integer

Try ' comienza el control de errores Console.WriteLine("Introducir un número") sValor = Console.ReadLine() ' si no hemos introducido un número... iNumero = sValor ' ...aquí se producirá un error...

' ...y no llegaremos a esta parte del código iNumero = iNumero + 1000

Catch ' si se produce un error, se genera una excepción ' que capturamos en este bloque de código ' manipulador de excepción, definido por Catch Console.WriteLine("Error al introducir el número" & _

ControlChars.CrLf & _ "El valor {0} es incorrecto", _ sValor)

Finally ' si se produce un error, después de Catch se ejecuta este bloque; ' si no se produce error, después de Try también se ejecuta Console.WriteLine("El controlador de errores ha finalizado")

End Try

' resto del código del procedimiento Dim dtFecha As Date Console.WriteLine("Introducir una fecha") ' si ahora se produce un error, ' al no disponer de una estructura para controlarlo ' se cancelará la ejecución dtFecha = Console.ReadLine() Console.WriteLine("La fecha es {0}", dtFecha) Console.ReadLine()

End Sub

Código fuente 393

Programación con Visual Basic .NET © Grupo EIDOS