Control de errores para aplicaciones robustas – 1 Los mensajes de error en Access El control de errores en tiempo de ejecución es uno de los temas más importantes para la creación de aplicaciones robustas. Access tiene varias instrucciones para interpretar todos estos errores que pueden aparecer cuando se está depurando la aplicación, debido a datos erróneos o a errores del usuario. En este curso trataremos los siguientes temas: 1. Lo básico del control de errores en tiempo de ejecución de Access 2. Formas de utilizar el control de errores 3. Los objetos Err y Error 4. Cómo seguir la pista a los errores utilizando un archivo de registro de errores personalizado. 5. Cómo crear un procedimiento de control de errores centralizado 6. Cuestiones sobre el control de errores 1. Mensajes de error en Access Cuando sucede un error, Access muestra por defecto una descripción del error. Como se muestra en la imagen inferior, en este cuadro de diálogo, si se elige Depurar, aparece la ventana de módulos, si se elige Continuar se ignora el error y si se elige Terminar se detiene la ejecución. Utilizar el controlador de errores es muy sencillo, una vez te hayas habituado. Es muy importante para el programador aprovecharse de su potencia. Hay muchas formas de utilizar el controlador de errores. Por ejemplo, utilizando el controlador de errores podemos captar errores que no se pueden depurar en tiempo de desarrollo. Estas son unas pocas situaciones que pueden ocurrir en tiempo de ejecución y pueden ser controladas utilizando instrucciones del controlador de errores de Access. El usuario ha olvidado colocar un disco necesario en la disquetera, causando un error. Se puede controlar el error y pedirle al usuario que coloque el disco. El usuario está borrando algunas tablas de la Base de datos mediante código, pero una de las tablas ya está borrada. Esto causa normalmente un error y se puede hacer que el controlador de errores continúe en la siguiente línea de código, obviando la tabla previamente borrada. Cuando alguien mueve en el servidor el Back end – la parte de la aplicación que contiene las tablas- a otra localización de red, se puede verificar esto al iniciar la aplicación, como se explica en el curso Creación de aplicaciones multiusuario. 2. Formas de utilizar el control de errores Cuando se trabaja en el control de errores de Access, éstas son las instrucciones que se pueden utilizar: On Error, Resume y Exit La instrucción On Error permite especificar dónde se quiere exactamente que Access actúe cuando suceda un error. La instrucción On Error tiene variables utilizadas para direccionar. Para controlar el control de errores se debe utilizar la instrucción On Error Goto: On Error Goto NumeroLinea|EtiquetaLinea La instrucción On Error Goto tiene dos opciones : Numero Línea, que puede ser un número situado en el procedimiento, o Etiqueta Línea que es una etiqueta que especifica el inicio de una sección de un procedimiento. El código siguiente crea un controlador de errores muy simple. Sub SimpleError(intNumerator As Integer, intDenominator As Integer) On Error GoTo SimpleError_Error Debug.Print intNumerator / intDenominator SimpleError_Error: MsgBox Err.Description, vbCritical, "Ha ocurrido un error" Exit Sub End Sub Este procedimiento muestra un mensaje de error “Ha ocurrido un error” y sale del mismo. Es mejor que el presentado en la figura anterior. Después de recibir el usuario este mensaje, la ejecución del programa sale directamente debido al error producido. La instrucción On Error Resume Next se utiliza cuando el programa necesita continuar en la línea que sigue inmediatamente a la que originó el error. Un ejemplo sucede cuando se intenta eliminar una tabla que ya ha sido eliminada. El código para éste ejemplo es el siguiente: Sub InlineResumeNextExample() '—Esta instrucción dice a Access que ignore los errores y '—salte a la siguiente línea. On Error Resume Next DoCmd.DeleteObject acTable, "UnaTabla" End Sub La instrucción On Error Goto 0 se utiliza cuando queremos que Access vuelva a su controlador de errores predeterminado, o queremos referirnos a un controlador de errores que fue activado en un procedimiento por encima del procedimiento activo. Esto se llama anidar un error. Dependiendo del tipo de procedimiento que se esté ejecutando se puede utilizar Exit Sub | Function para salir directamente del controlador de errores. El siguiente código utiliza la instrucción Exit Sub para salir del procedimiento después de mostrar el error. Sub SimpleError(intNumerator As Integer, intDenominator As Integer) On Error GoTo SimpleError_Error Debug.Print intNumerator / intDenominator SimpleError_Error: MsgBox Err.Description, vbCritical, "Ha ocurrido un error" Exit Sub End Sub Las instrucciones Resume, Resume Next y Resume Etiqueta | línea se utilizan dentro del controlador de errores para continuar con el procedimiento después de tratar el error. La instrucción Resume devuelve la ejecución del procedimiento a la línea en la que ocurrió el error. Esta instrucción se utiliza cuando el error puede ser solventado y se vuelve a reintentar. Por ejemplo, cuando el usuario intenta copiar un archivo en la disquetera sin que haya introducido un disquette en la unidad. Utilizando la instrucción Resume, se puede pedir al usuario que inserte un disquette y lo intente de nuevo. Sub ResumeExample(intNumerator As Integer, intDenominator As Integer) On Error GoTo Error_ResumeExample DoCmd.CopyDatabaseFile "C:\Mis BD\MiBD.mdb", True Exit Sub Error_ResumeExample: Msgbox “ Compruebe que hay disco en la disquetera e intente de nuevo.“ Resume Else Exit Sub End If End Sub La instrucción Resume Next proporciona la capacidad de dar un mensaje, tratar el error y desplazarse a la siguiente línea de código posterior a la que originó el error. Sub ResumeNextExample() On Error GoTo Error_ResumeNextExample DoCmd.DeleteObject acTable, "CualquierTabla" Exit Sub Error_ResumeNextExample: MsgBox Err.Description, vbCritical, "Error al intentar eliminar la tabla" Resume Next End Sub En éste caso Resume Next no hace mucho, pero al menos avisa al usuario de que no se ha realizado lo que pretendía. La instrucción Resume Etiqueta | línea permite continuar en la etiqueta de línea especificada. Esta instrucción se utiliza habitualmente para crear una salida del procedimiento. Sub ResumeLineLabelExample() On Error GoTo Error_ResumeLineLabelExample DoCmd.DeleteObject acTable, "NoTable" '—Esta etiqueta inicia la salida del procedimiento Exit_ResumeLineLabelExample: Exit Sub '—Esta etiqueta es para tartar el error Error_ResumeLineLabelExample: MsgBox Err.Description, vbCritical, "Error al eliminar la tabla" Resume Exit_ResumeLineLabelExample End Sub