Manejo estructurado de errores.

Un error en tiempo de ejecuci贸n es un error que se da en el c贸digo al ejecutar la aplicaci贸n y puede terminar forzosamente la aplicaci贸n o hacer que se ejecute incorrectamente. Tambi茅n existen errores l贸gicos y de sintaxis. Por fortuna el propio editor de Visual Studio.NET incluye los bloques necesarios para el tratamiento de los errores de nuestra aplicaci贸n.En esta clase aprender谩s todo lo necesario para el tratamiento de errores.

Manejadores de excepciones.

Un bloque de c贸digo que maneja errores en tiempo de ejecuci贸n es tambi茅n conocido como un bloque de excepciones.

En 茅l crearemos las estructura para en el caso de que se produzca un error, no se detenga el programa y se siga ejecutando. Por ejemplo si en nuestro programa tenemos escrito que al pulsar un bot贸n se abra la bandeja del lector de DVD de nuestro PC, y suponiendo que nuestro PC no tenga instalado dicho hardware, se producir铆a una excepci贸n por no encontrarse el dispositivo y no poder ejecutarse la instrucci贸n programada.

La rutina que ha generado el error, se llama manejador estructurado de error, y es lo que utilizaremos para conocer los errores en tiempo de ejecuci贸n a medida que vayan ocurriendo en un programa.

Proceso de errores con Try...Catch.
Un fallo en la ejecuci贸n de un programa puede acarrear un inesperado bloqueo o cierre de la aplicaci贸n del programa haciendo que pierdas toda la informacion manejada hasta el momento. Existen una rutinas especiales denominadas manejadores estructurados de errores que permiten tratar estos errores en tiempo de ejecuci贸n y programan alternativas al fallo catastr贸fico. Dichos manejadores manipulan el error en tiempo de ejecuci贸n indicandole al programa que tiene que hacer como alternativa para evitar su colapso, alternativa que programar谩s mediante un bloque estructurado llamado Try - Catch.

Todos los errores que se produzcan dentro del bloque Try - Catch ser谩n tratados de manera diferente evitando que la aplicaci贸n se quede colapsada, en espera o se cierre inesperadamente. Adem谩s podremos introducir alternativas de colaci贸n al error.

Tipos de manejadores de error.
Pueden existir muchos tipos de errores y para cada tipo hay que manejar el error en consecuencia. No es lo mismo un error por no existir una unidad, por ejemplo, que otro error por producirse un fallo de buffering.

En la siguiente tabla muestra la lista de problemas a los que podr铆an enfrentarse los manejadores de error.

ProblemaDescripci贸n
Problemas de red/InternetServidores de red, modems o recursos que fallan o caen de forma inesperada.
Problemas con unidades.Discos sin formato o mal formateados, discos mal introducidos, sectores del disco err贸neos, discos llenos, problemas con la unidad, etc.
Problemas de rutas de acceso.La ruta de acceso o un archivo ha desaparecido.
Problemas de impresoras.No existe la impresora, o est谩 desconectada, sin papel, sin memoria o no disponible por otras causas.
Sofware no instalado.Un archivo o componente que necesite su aplicaci贸n, pero que no se encuentre instalada en el equipo o que exista una incopatibilidad.
Problemas de permisos.El usuario que utiliza la aplicaci贸n no cuenta con los permisos necesarios para ejecutar una tarea.
Errores de desbordamiento.La actividad de la aplicaci贸n excede del espacio de almacenamiento asignado (overfload).
Problemas l贸gicos.Errores de sintaxis o l贸gicos no detectados por el compilador.

Sentencias Try...Catch.

El bloque Try-Catch es un bloque utilizado para capturar errores de tiempo de ejecuci贸n. Se compone de dos bloques fundamentales:

El bloque Try en donde se programar谩 la acci贸n que ser谩 susceptible de producir fallos, y el bloque Catch que ser谩 el bloque que se ejecute en caso de producirse el fallo. Veamos un ejemplo.

programa editor de texto

En el siguiente proyecto he creado un formulario de Windows Form y le he agregado un control TextBox con su propiedad MultiLine en True. Adem谩s he agregados tres CheckBoxs para escoger el formato en el que voy a guardar el texto del programa. Por 煤ltimo un bot贸n de Guardar que guardar谩 en el formato escogido.

El funcionamiento es sencillo. Sin programar a煤n el formato de guardado, cuando escriba un texto y pulse el bot贸n de guardar, se guardar谩 en un archivo de tipo txt en la ra铆z del proyecto.

funcionamiento del editor b谩sico

En esta situaci贸n no se produce ning煤n error porque la estructura del programa est谩 realizada correctamente:

c贸digo fuente del editor

El programa va a guardar el archivo por defecto en la ra铆z de la aplicaci贸n dentro de la carpeta Projects de Visual Studio en tu versi贸n actual. Pero si escojo otra ruta diferente y esa ruta no existe en tu PC, se va a producir un error. As铆 por ejemplo selecciono que se guarde en un directorio ra铆z llamado A:/ (antigua disquetera).

Error en tiempo de ejecuci贸n

Es un error muy com煤n ya que como no existe el directorio el programa se interrumpe autom谩ticamente. Sin embargo si introducimos dentro de un bloque Try - Catch dicha instrucci贸n, no saldr谩 el mensaje y se ejecutar el contenido del bloque Catch. En el siguiente ejemplo puedes ver que si no encuentra la disquetera, te lanzar谩 el error contenido en el bloque Catch, pero ejecutar谩 el programa.

Al encontrar un error se ejecuta el bloque Catch

Tambi茅n te puedes fijar que en el bloque Catch he utilizado el atributo Ex.message que me saca una descripci贸n del fallo de error por pantalla en tiempo de ejecuci贸n.

Bloque Finally.

El bloque Finally es un bloque adicional que se puede usar en la estructura de control de errores y que es opcional al bloque Try - Catch. De forma que el bloque Finally se usa despu茅s del bloque Catch de manera que siempre se ejecutar谩 se produzca error o no se produzca error.

Excepci贸n de Finally siempre se ejecutar谩

Si el bloque Try devolviera un resultado positivo en lugar de un error, no se ejecutar铆a el bloque Catch, pero si el bloque Finally, por lo que su uso debe de adaptarse a las circunstancias del programador.

Excepci贸n de Finally siempre se ejecutar谩

Manejadores de errores complejos.

A medida que tus programas vayan siendo m谩s complejos, los manejadores de error Try - Catch que escribas ser谩n m谩s complejos que gestionar谩n multitud de situaciones de manejo de error.

Existe un objeto especial de error llamado Err que te permitir谩 identificar y procesar errores en tu programa as铆 como condiciones espec铆ficas en tiempo de ejecuci贸n.

Objeto Err.
El objeto Err es un objeto especial de VB.NET alq ue se le asigna informaci贸n detallada sobre el manejo de errores cada vez que se produce un error en tiempo de ejecuci贸n. Dispone, como todos los objetos, de propiedades y m茅todos por lo que repasaremos los mas usados.

● Err.Number: Contiene el n煤mero del 煤ltimo error en tiempo de ejecuci贸n producido.
● Err.Description: Contiene un breve mensaje de la descripci贸n del error.
● Err.Clear: Descarga la informaci贸n almacenada en las anteriores propiedades.

A continuaci贸n se muestra una serie de errores en tiempo de ejecuci贸n que puede sufrir una aplicaci贸n en VB.NET. Las informaciones adicionales sobre los errores se encontrar en l铆nea. Adem谩s de estos c贸digos, existen otras bibliotecas y componentes que tienen sus propios c贸digos de error (como bases de datos, por ejemplo)

tabla de errores

Existen m谩s errores disponibles. Los n煤meros que no se han utilizado quedan reservados para futuros errores a introducir en futuras versiones de VB.NET (Si es que no decae el lenguaje m谩s).

Clausula when.
Esta clausula es usada para darle mayor control al error de forma que si queremos establecer que un mensaje de error se de porque, por ejemplo no se encontr贸 la ruta del archivo, podamos especificarlo y saber que tipo de error nos devuelve el programa.

tabla de errores

En el anterior ejemplo el error que nos devuelve es el 5, que si miramos la tabla anterior es argumento a llamada a procedimiento no v谩lido porque no hemos establecido la variable str en el objeto fs.

Pues podemos hacer que nos muestre un error espec铆fico cuando se produzca 茅ste tipo de error de la forma siguiente:

Fallo espec铆fico

La sintaxis Catch When se utiliza dos veces en el manejador de error y cada una de ellas se emplea con la propiedad Err.Number para comprobar que tipo de error en tiempo de ejecuci贸n se produce en el bloque Try.

Existen otros manejadores indirectos en VB.NET que realizan bloques de errores de acuerdo a la condici贸n que devuelva una acci贸n; te suena, 驴verdad?. Los condicionales permiten establecer condiciones de validaci贸n y evitan errores con el bloque else o elseif. Esto es lo que se llama programaci贸n defensiva.