La clase Exception

La clase Exception

===

La clase Exception

Como hemos explicado en anteriores apartados, cada vez que se produce un error, el entorno de ejecución genera una excepción con la información del error acaecido.

Para facilitarnos la tarea de manipulación de la excepción producida, en un controlador de excepciones obtenemos un objeto de la clase Exception, o de alguna de sus derivadas, de forma que, a través de sus miembros, podemos saber qué ha pasado. Entre las propiedades y métodos que podemos utilizar, se encuentran las siguientes.

• Message. Descripción del error. • Source. Nombre del objeto o aplicación que provocó el error. • StackTrace. Ruta o traza del código en la que se produjo el error. • ToString( ). Devuelve una cadena con información detallada del error. En esta cadena

podemos encontrar también, los valores obtenidos de las propiedades anteriores; por lo que el uso de este método, en muchas ocasiones será el modo más recomendable para obtener los datos de la excepción.

Podemos obtener el objeto de excepción creado a partir de un error, utilizando la sentencia Catch de la estructura Try. Para ello, a continuación de Catch, escribimos el nombre de un identificador, definiéndolo como tipo Exception o alguno de los tipos de su jerarquía.

El Código fuente 394 muestra la captura de la excepción en el ejemplo anterior, dentro de la sentencia Catch, pero en este caso utilizando un objeto Exception. El resto del código es igual que el anterior ejemplo.

' .... Try

' .... ' ....

Catch oExcep As Exception ' si se produce un error, se crea un objeto excepción ' que capturamos volcándolo a un identificador ' de tipo Exception Console.WriteLine("Se produjo un error. Información de la excepción") Console.WriteLine("================================================") Console.WriteLine("Message: {0}", oExcep.Message) Console.WriteLine() Console.WriteLine("Source: {0}", oExcep.Source) Console.WriteLine() Console.WriteLine("StackTrace: {0}", oExcep.StackTrace) Console.WriteLine() Console.WriteLine(oExcep.ToString())

Finally ' .... ' ....

End Try ' ....

Código fuente 394

© Grupo EIDOS 26. Manipulación de errores

El Código fuente 395 contiene una pequeña muestra de los valores obtenidos a partir de las propiedades Message, Source y StackTrace, tras la ejecución del fuente anterior.

Message: Cast from String ('hola') to Integer is not valid.

Source: Microsoft.VisualBasic

StackTrace: at Microsoft.VisualBasic.Helpers.IntegerType.FromString(String Value)

at ErroresPru.Module1.Main() in K:\CursoVBNET\Texto\t16Errores\ErroresPru\Module1.vb:line 12

Código fuente 395

Exception representa la clase base en la jerarquía de tipos de excepción que se pueden producir dentro del entorno de ejecución.

Partiendo de Exception, disponemos de un conjunto de clases derivadas, que nos permiten un tratamiento más particular del error producido, como ApplicationException, IOException, SystemException, etc. Cada una de ellas puede tener, además de los miembros generales de Exception, una serie de métodos y propiedades particulares de su tipo de excepción; por ello, lo más conveniente, será utilizar estas clases, a través de las que podremos averiguar más detalles sobre el problema producido.

Captura de excepciones de diferente tipo en el mismo controlador

de errores

Cuando en el código de un controlador de errores puedan producirse errores de distintos tipos de excepción, debemos situar tantas sentencias Catch como excepciones queramos controlar.

En el Código fuente 396, hasta el momento, hemos controlado los errores por conversión de tipos. Ahora vamos a añadir varias líneas más, que obtienen un valor, y lo asignan a un índice de un array. Dado que el índice a manipular lo pedimos al usuario, y es posible que dicho elemento no exista en el array, añadiremos un nuevo manipulador para este tipo de excepción, mediante la sentencia Catch correspondiente.

Public Sub Main() Dim sValor As String Dim iNumero As Integer Dim sLetras() As String = {"a", "b", "c", "d"}

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

' introducir una letra y asignarla a una ' posición del array

Programación con Visual Basic .NET © Grupo EIDOS

Dim sNuevaLetra As String Dim iPosicion As Integer Console.WriteLine("Introducir una letra") sNuevaLetra = Console.ReadLine() Console.WriteLine("Introducir posición del array para la letra") iPosicion = Console.ReadLine() ' si al asignar la letra al array no existe ' el índice, se producirá un error sLetras(iPosicion) = sNuevaLetra

Catch oExcep As System.InvalidCastException ' excepción producida por un error al intentar ' realizar una conversión de tipos Console.WriteLine(oExcep.ToString())

Catch oExcep As System.IndexOutOfRangeException ' excepción producida por un error ' al intentar usar un índice inexistente ' de array, o índice fuera de rango Console.WriteLine(oExcep.ToString())

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

Console.ReadLine() End Sub

Código fuente 396