Elementos de control de errores en tiempo de ejecución
Errores y control de errores
Cuando esté programando una aplicación, es necesario que considere qué pasa cuando se produce un error. En una aplicación puede producirse un error por una de estas dos razones. Primero, en el momento en el que se ejecuta la aplicación, alguna condición hace que se produzca un error en el código que normalmente no ocurre. Por ejemplo, si el código intenta abrir una tabla que el usuario ha eliminado, se produce un error. Segundo, el código puede contener una lógica que no sea adecuada y que le impida hacer lo que tiene previsto. Por ejemplo, se produce un error si el código intenta dividir un valor por cero.
Si no se ha desarrollado tratamiento de errores, Visual Basic detiene la ejecución y muestra un mensaje de error cuando se produce un error en el código. En este momento, lo más seguro es que el usuario de la aplicación se quede confundido y frustrado cuando ocurra esto. Muchos de los problemas se pueden anticipar incluyendo en el código cuidadosas rutinas de tratamiento de errores para tratar cualquier error que pueda ocurrir.
Cuando en un procedimiento se agregan tratamientos de errores, debe considerarse cómo enrutará el procedimiento la ejecución cuando se produzca un error. El primer paso en la ejecución del enrutamiento a un tratamiento de errores es habilitar uno, incluyendo dentro del procedimiento algún tipo de instrucciones On Error. La instrucción On Error dirige la ejecución en el caso de que se produzca un error. Si no hay instrucción On Error, cuando se produce el error Visual Basic simplemente detiene la ejecución y muestra un mensaje de error.
Cuando se produce un error en un procedimiento que posee un tratamiento de errores habilitado, Visual Basic no muestra el mensaje de error normal. En su lugar, enruta la ejecución al tratamiento de errores, si existe alguno. Cuando la ejecución pasa al tratamiento de errores habilitado, éste se vuelve activo. En el tratamiento de errores activo, se puede determinar el tipo de error que se produjo y tratarlo de la manera que elija. Access proporciona tres objetos que contienen información sobre los errores que se han producido, el objeto Error de ADO, el objeto Err de Visual Basic y el objeto Error de DAO.
Enrutamiento de la ejecución cuando se produce un error
Un controlador de errores especifica lo que sucede dentro de un procedimiento cuando se produce un error. Por ejemplo, puede que quiera finalizar el procedimiento si se produce cierto error o que quiera corregir la condición que provocó el error y luego continuar con la ejecución. Las instrucciones On Error y Resume determinan cómo continúa la ejecución en caso de error.
Instrucción On Error
La instrucción On Error habilita o deshabilita una rutina de tratamiento de errores. Si una rutina de tratamiento de errores está habilitada, la ejecución pasa a esta rutina cuando se produce un error.
La instrucción On Error tiene tres formas: On Error GoToetiqueta, On Error GoTo 0 y On Error Resume Next. La instrucción On Error GoToetiqueta habilita una rutina de tratamiento de errores, que comienza a partir de la línea en la que se encuentra la instrucción. La rutina de tratamiento de errores debe habilitarse antes de la primera línea en la que pueda producirse el error. Cuando el controlador de errores está activo y se produce un error, la ejecución pasa a la línea especificada en el argumento etiqueta.
La línea especificada en el argumento etiqueta debe estar al principio de la runtina de tratamiento de errores. Por ejemplo, el siguiente procedimiento especifica que, si se produce un error, la ejecución pasa a la línea etiquetada:
Function MayCauseAnError()
' Enable error handler.
On Error GoTo Error_MayCauseAnError
. ' Include code here that may generate error.
.
.
Error_MayCauseAnError:
. ' Include code here to handle error.
.
.
End Function
La instrucción On Error GoTo 0 deshabilita el tratamiento de errores dentro de un procedimiento. No especifica la línea 0 como el inicio del código de tratamiento de errores, incluso si el procedimiento contiene una línea numerada como 0. Si no existe la instrucción On Error GoTo 0 en el código, el tratamiento de errores se deshabilita automáticamente cuando se haya ejecutado el procedimiento completamente. La instrucción On Error GoTo 0 restablece las propiedades del objeto Err, lo cual produce el mismo efecto que el método Clear del objeto Err.
La instrucción On Error Resume Next omite la línea que provoca el error y enruta la ejecución a la línea siguiente a la que provocó el error. La ejecución no se interrumpe. Use la instrucción On Error Resume Next si desea comprobar las propiedades del objeto Err inmediatamente después de una línea en la que prevé que se producirá un error y controlar el error dentro del procedimiento en lugar de en un controlador de errores.
Instrucción Resume
La instrucción Resume dirige de nuevo la ejecución al cuerpo del procedimiento desde una rutina de tratamiento de errores. Puede incluir una instrucción Resume dentro de una rutina de tratamiento de errores si desea que la ejecución continúe en un punto determinado de un procedimiento. Sin embargo, la instrucción Resume no es necesaria; también puede finalizar el procedimiento detrás de la rutina de tratamiento de errores.
La instrucción Resume tiene tres formas. La instrucción Resume o Resume 0 devuelve la ejecución a la línea en la que se produjo el error. La instrucción Resume Next devuelve la ejecución a la línea que siguiente a la que originó el error. La instrucción Resumeetiqueta devuelve la ejecución a la línea determinada en el argumento etiqueta. El argumento etiqueta debe indicar una etiqueta de línea o un número de línea.
Normalmente, la instrucción Resume o Resume 0 se utiliza cuando el usuario deba realizar una corrección. Por ejemplo, si pregunta al usuario por el nombre de una tabla que desee abrir, y el usuario escribe el nombre de una tabla que no existe, puede preguntarle de nuevo al usuario y continuar la ejecución con la instrucción que provocó el error.
La instrucción Resume Next se utiliza cuando el código corrige el error dentro de un tratamiento de errores, y desea continuar la ejecución sin volver a ejecutar la línea que provocó el error. La instrucción Resumeetiqueta se usa cuando se quiere continuar la ejecución en otro punto del procedimiento, determinado en el argumento etiqueta. Por ejemplo, podría continuar la ejecución en una rutina de salida, como se describe en la siguiente sección.
Salir de un procedimiento
Cuando incluya en un procedimiento una rutina de tratamiento de errores, debe incluir también una rutina de salida, de forma que la rutina de tratamiento de errores se ejecutará sólo si se produce un error. Se puede especificar una rutina de salida con una etiqueta de línea de la misma forma que se especifica una rutina de tratamiento de errores.
Por ejemplo, puede agregar una rutina de salida al ejemplo de la sección anterior. Si no se produce un error, la rutina de salida se ejecuta detrás del cuerpo del procedimiento. Si se produce un error, entonces la ejecución pasa a la rutina de salida después de que se haya ejecutado el código de la rutina de tratamiento de errores. La rutina de salida contiene una instrucción Exit.
Function MayCauseAnError()
' Enable error handler.
On Error GoTo Error_MayCauseAnError
. ' Include code here that may generate error.
.
.
Exit_MayCauseAnError:
Exit Function
Error_MayCauseAnError:
. ' Include code to handle error.
.
.
' Resume execution with exit routine to exit function.
Resume Exit_MayCauseAnError
End Function
Control de errores en procedimientos anidados
Cuando se produce un error en un procedimiento anidado que no tiene habilitado el tratamiento de errores, Visual Basic retrocede buscando por la lista de llamadas un tratamiento de errores en otro procedimiento, en lugar de detener simplemente la ejecución. Esto proporciona al código la oportunidad de corregir el error dentro de otro procedimiento. Por ejemplo, suponga que el Procedimiento A llama al Procedimiento B, y que el Procedimiento B llama al Procedimiento C. Si se produce un error en el Procedimiento C y éste no tiene habilitado el tratamiento de errores, Visual Basic comprueba el Procedimiento B, y luego el Procedimiento A, para ver si hay un tratamiento de errores habilitado. Si existe uno, la ejecución pasa al tratamiento de errores. Si no, se detiene la ejecución y se muestra un mensaje de error.
Visual Basic también retrocede buscando por la lista de llamadas un controlador de errores cuando se produce un error dentro de un controlador de errores activo. Puede forzar a Visual Basic a buscar hacia atrás a través de la lista de llamadas generando un error dentro de un controlador de errores activo con el método Raise del objeto Err . Esto resulta útil para ocuparse en el tratamiento de errores de los errores que no previó. Si se produce un error que no previó, y ese error se regenera dentro del tratamiento de errores, entonces la ejecución retrocede en la lista de llamadas para buscar otro tratamiento de errores, que puede haber sido establecido para tratar el error.
Por ejemplo, suponga que el Procedimiento C tiene un tratamiento de errores habilitado, pero que el tratamiento de errores no corrige el error que se ha producido. Una vez que el tratamiento de errores ha comprobado todos los errores que se previeron, puede regenerar el error original. La ejecución retrocede entonces por la lista de llamadas al tratamiento de errores del Procedimiento B, si es que existe, ofreciendo la oportunidad de que este tratamiento de errores corrija el error. Si no existe tratamiento de errores en el Procedimiento B o si no puede corregir el error y regenerarlo de nuevo, entonces la ejecución pasa al tratamiento de errores del Procedimiento A, suponiendo que exista uno.
Para ilustrar este concepto de otra manera, supongamos que tiene un procedimiento anidado que incluye el control de errores para un error de error de coincidencia de tipo, un error que ha anticipado. En algún momento, se produce un error de división por cero, que no ha previsto, dentro del procedimiento C. Si ha incluido una instrucción para volver a generar el error original, la ejecución pasa una copia de seguridad de la lista de llamadas a otro controlador de errores habilitado, si existe uno. Si ha corregido un error de división por cero en otro procedimiento de la lista de llamadas, se corregirá el error. Si el código no vuelve a generar el error, el procedimiento continúa ejecutándose sin corregir el error de división por cero. Esto a su vez puede provocar otros errores dentro del conjunto de procedimientos anidados.
En resumen, Visual Basic hace una búsqueda hacia atrás en la lista de llamadas de un tratamiento de errores habilitado si:
Se produce un error en un procedimiento que no incluye un tratamiento de errores habilitado.
Se produce un error dentro de un tratamiento de errores activo. Si se usa el método Raise del objeto Err para generar un error, puede forzar a Visual Basic a buscar hacia atrás en la lista de llamadas un tratamiento de errores habilitado.
Obtención de información sobre un error
Una vez que la ejecución haya pasado a la rutina de tratamiento de errores, el código debe determinar qué error se ha producido y resolverlo. Visual Basic y Access ofrecen varios elementos del lenguaje que puede usar para obtener información sobre un error determinado. Cada uno de ellos es adecuado para distintos tipos de errores. Puesto que los errores pueden producirse en distintas partes de la aplicación, es necesario determinar cuál de ellos usar en el código basado en los errores que se previeron.
Los elementos del lenguaje disponibles para el tratamiento de errores incluyen:
Err (objeto)
Objeto Error de ADO y colección Errors
Objeto Error de DAO y colección Errors
AccessError ( método)
Objeto Err
El objeto Err lo proporciona Visual Basic. Cuando se produce un error de Visual Basic, la información sobre ese error se almacena en el objeto Err. El objeto Err mantiene información sobre un solo error cada vez. Cuando se produce un nuevo error, el objeto Err se actualiza para incluir la información sobre el nuevo error.
Para obtener información sobre un error determinado, puede usar las propiedades y los métodos del objeto Err :
- La propiedad Number es la propiedad predeterminada del objeto Err y devuelve el número identificativo del error que se produjo.
- La propiedad Description del objeto Err devuelve la cadena descriptiva asociada con un error de Visual Basic.
- El método Clear borra la información de error actual del objeto Err.
- El método Raise genera un error particular y rellena las propiedades del objeto Err con la información sobre ese error.
El siguiente ejemplo muestra cómo usar el objeto Err en un procedimiento que puede provocar un error de no coincidencia de tipo:
Function MayCauseAnError()
' Declare constant to represent likely error.
Const conTypeMismatch As Integer = 13
On Error GoTo Error_MayCauseAnError
. ' Include code here that may generate error.
.
.
Exit_MayCauseAnError:
Exit Function
Error_MayCauseAnError:
' Check Err object properties.
If Err = conTypeMismatch Then
. ' Include code to handle error.
.
.
Else
' Regenerate original error.
Dim intErrNum As Integer
intErrNum = Err
Err.Clear
Err.Raise intErrNum
End If
' Resume execution with exit routine to exit function.
Resume Exit_MayCauseAnError
End Function
Observe que en el ejemplo anterior, el método Raise se usa para regenerar el error original. Si se produjera otro error que no sea de no coincidencia de tipos, la ejecución retrocederá hacia atrás en la lista de llamadas a otro tratamiento de errores habilitado, si existe alguno.
El objeto Err ofrece toda la información necesaria sobre los errores de Visual Basic. Sin embargo, no proporciona información completa sobre los errores de Access ni los errores del motor de base de datos de Access. Los objetos de acceso y acceso a datos (DAO)) proporcionan elementos de lenguaje adicionales para ayudarle con esos errores.
Objeto Error y colección Errors
El objeto Error y la colección Errors son ofrecidos por DAO y por ADO. El objeto Error representa un error de DAO o ADO. Una única operación de DAO o ADO puede provocar varios errores, especialmente si está realizando operaciones ODBC de DAO. Cada error que se produce en una operación determinada de acceso a datos tiene asociado un objeto Error. Todos los objetos Error asociados con una operación DAO o ADO determinada se almacenan en la colección Errors, siendo el error de menor nivel el primer objeto de la colección y el error de mayor nivel el último objeto de la colección.
Cuando se produce un error DAO o ADO, el objeto Err de Visual Basic contiene el número de error del primer objeto de la colección Errors. Para determinar si se han producido errores DAO o ADO adicionales, compruebe la colección Errors. Los valores de la propiedad Number de ADO o Number de DAO, o la propiedad Descripción (Description) de ADO o Descripción (Description) de DAO del primer objeto Error de la colección Errors deben coincidir con los valores de las propiedades Number y Descripción (Description) del objeto Err de Visual Basic.
AccessError (método)
Use el método Raise del objeto Err para generar un error de Visual Basic que no se haya producido realmente y determinar la cadena descriptiva asociada a ese error. Sin embargo, no puede usar el método Raise para generar un error de Access, un error de ADO o un error DAO. Para determinar la cadena descriptiva asociada a un error de Access, un error de ADO o un error DAO que no se ha producido realmente, use el método AccessError .
Evento de error
Use el evento Error para interceptar los errores que se producen en un formulario o informe de Access. Por ejemplo, si un usuario intenta escribir texto en un campo cuyo tipo de datos es Fecha/Hora, se producirá el evento Error. Si agrega un procedimiento de evento Error a un formulario Empleados, y luego intenta insertar un valor de texto en el campo FechaContrato, se producirá un procedimiento de evento Error.
El procedimiento de evento Error toma un argumento de entero, DataErr. Cuando se ejecuta un procedimiento de evento Error, el argumento DataErr contiene el número del error de Access que se produjo. La única forma de determinar el número de error que se produjo es comprobar el valor del argumento DataErr dentro del procedimiento de evento. El objeto Err no se rellena con la información del error después de que se produzca el evento Error. Use el valor del argumento DataErr junto con el método AccessError para determinar el número del error y su cadena descriptiva.
Nota:
La instrucción Error y la función Error se ofrecen sólo por motivos de compatibilidad con versiones anteriores. Cuando escriba nuevo código, use los objetos Err y Error, la función AccessError, y el evento Error para obtener información sobre un error.
Información sobre los colaboradores
Vínculo proporcionado por de la comunidad) de la comunidad utterAccess .
UtterAccess es el principal foro de ayuda y wiki de Microsoft Access.
Vea también
- Acceso al foro de desarrolladores
- Acceso a la ayuda en support.office.com
- Acceso a foros en UtterAccess
- Acceso al centro de ayuda de programadores VBA y desarrolladores (FMS)
- Acceso a las publicaciones en StackOverflow
Soporte técnico y comentarios
¿Tiene preguntas o comentarios sobre VBA para Office o esta documentación? Vea Soporte técnico y comentarios sobre VBA para Office para obtener ayuda sobre las formas en las que puede recibir soporte técnico y enviar comentarios.