Control Estructurado de errores
|
|
|
Excepciones
En este artículo aprenderemos a utilizar el control estructurado de errores que nos ofrece VB.NET que, a diferencia de VB, permite estructurar mediante las instrucciones Try, Catch, Finally y End Try. Los programadores de Delphi encontraran muchas similitudes con la nueva estructura de NET y los usuarios de VB 6 o de anteriores versiones, encontrarán mucho más útil y organizada la "captura" de errores estructurada en substitución de los anteriores "On error goto". Los programas suelen fallar por múltiples razones, desde una entrada incorrecta de datos por parte del usuario hasta la realización de un cálculo erróneo, como por ejemplo una división por cero o error por desbordamiento al multiplicar valores muy grandes, accesos a tablas en uso o inactivas...etc. El descuido de estas excepciones provocarán, en tiempo de ejecución, que la aplicación deje de funcionar en el momento en que ocurra algún error no contemplado por el programador. ¿Debemos entonces prevenir a todo el código de estos errores? No hace falta. Sólo tenemos que que añadir un controlador estructurado de excepción donde realicemos operaciones que puedan provocar errores ya que una buena parte del código no generará excepciones. Veamos la estructura de error :
Try
Las instrucciones mínimas necesarias para crear un control de errores son Try y End Try. Las instrucciones Catch y Finally no son obligatorias pero las utilizaremos para advertir al usuario mediante mensajes o modificar valores para evitar el error y como mínimo utilizaremos una de ellas dentro de la estructura. Utilizaremos Catch para advertir al usuario del error que se ha producido o intentar, dependiendo de cada excepción, cambiar un valor o reintentar una acción. Hay que tener en cuenta que existen muchísimos tipos de excepciones y que no existe un procedimiento genérico para controlarlas a todas. La forma, advertencia o método de control la veremos según el tipo de función que estemos haciendo y de su importancia. También debo añadir que podemos utilizar varias instrucciones Catch, dentro de un mismo bloque de control estructurado, para controlar más de un error específico. En resumen, cuando se produce una excepción dentro del Try el programa pasa a ejecutar el código que tenemos en Catch dejando de lado las instrucciones que se encuentren por debajo de la línea que haya causado el error dentro del Try. Veamos un ejemplo : Creamos un pequeño código con una estructura Try/Catch y programamos una división por cero. Al producirse el error se deja de ejecutar el código del bloque Try para ejecutar las sentencias que hemos escrito dentro de Catch por lo tanto, no se ejecutarán todas las líneas inferiores a la excepción.
|
|
NOTA : en algunos ejemplos utilizaré la consola de NET para mostrar los resultados. De esta forma no hará falta crear ningún formulario ni msgbox's para ver si la aplicación funciona como debería. La ventana de la consola se encuentra en "modo ejecución" en la parte inferior derecha dentro del la pestaña "output".
Seguramente encontraremos lugares dónde veremos claramente que el usuario puede provocar un error al asignar, por ejemplo, una edad de 250 años a una persona. En este caso el programa no detectaría ningún error de tipo ya que el valor "250" es un entero correcto (supongamos que el campo consta como entero). Para estos casos, NET nos permite provocar excepciones "personalizadas" según las normas o reglas que queramos utilizar para el control de los datos. Para crear excepciones tendremos que utilizar la instrucción Throw seguida del nombre de la excepción. Veamos un ejemplo global de como provocar y gestionar una excepción utilizando la clase gato del tema anterior . Ampliaremos la clase gato añadiendo una excepción PesoErroneo en substitución del MsgBox que nos mostraba el mensaje "Peso Erroneo".
|
|
Property Peso() As Integer Get Return tpeso End Get Set(ByVal Value As Integer) If Value > 100 And Value < 10000 Then tpeso = Value Else Dim PesoErroneo As New ArgumentException() Throw PesoErroneo End If End Set End Property
|
|
Vamos a probar nuestra propia excepción. En el formulario principal añadiremos el siguiente código :
|
|
Try Gato1.Peso = 2000 MsgBox("Ahora el gato pesa " & Gato1.Peso) Gato1.Peso =11000 'Aquí no llegará el código Catch PesoErroneo As ArgumentException MsgBox("Error en el peso") End Try
|
|
Podemos comprobar como la primera asignación a la propiedad peso no crea ninguna excepción. No pasará lo mismo al intentar asignar el valor de 11000 ya que está fuera del rango que hemos programado en la clase. La Clase provoca la excepción PesoErroneo y esta es gestionada dentro de nuestro bloque de control de errores. De la misma forma en la que hemos capturado nuestra excepción también podríamos añadir otro Catch para gestionar otro error. Throw también nos permite crear excepciones sin tener que crear una nueva instancia pero debemos tener en cuenta, que al provocarla de esta forma, podemos tener problemas dentro del Catch para reconocer el tipo de error que estamos gestionando.
|
|
Throw New Exception("Se ha producido un error")
|
|
Este sitio se actualizó por última vez el 27 de diciembre de 2004