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.