Controlar errores de tiempo de ejecución
Los errores en tiempo de ejecución se producen después de que comienza la ejecución de la aplicación. Entre las acciones que podrían generar errores en tiempo de ejecución se encuentran la escritura en un archivo que no existe, el intento de abrir una tabla que ya está abierta, el intento de seleccionar una tabla que se ha cerrado, la presencia de un conflicto de datos, la división de un valor entre cero, etc.
A veces surgen errores cuando los usuarios ejecutan su aplicación. Puede llamar a su propia rutina de tratamiento de errores incluyendo ON ERROR. Normalmente, ON ERROR utiliza un comando DO para ejecutar una rutina que controla el error, como en este ejemplo:
ON ERROR DO My_Error
Si su aplicación no contiene ninguna rutina de tratamiento de errores y se produce un error, la aplicación se interrumpirá y Visual FoxPro presentará un mensaje de error con las siguientes opciones:
- Cancelar Si el usuario elige "Cancelar", Visual FoxPro detendrá inmediatamente la ejecución de la aplicación y devolverá el control al sistema.
- Ignorar Si el usuario elige "Ignorar", Visual FoxPro pasará por alto la línea que originó el error y continuará con la línea siguiente del programa.
Para ver una lista completa de los mensajes de error de Visual FoxPro y una explicación de los mismos, vea Mensajes de error.
Sugerencia Asegúrese de proporcionar documentación a los usuarios que describa los errores que sean visibles y que sugiera posibles formas de corregirlos.
Los comandos y funciones siguientes resultan útiles para anticiparse y controlar los errores en tiempo de ejecución.
Para | Utilice |
---|---|
Llenar una matriz con información de error | AERROR( ) |
Abrir la ventana Depurador o Seguimiento | DEBUG o SET STEP ON |
Generar un error específico para probar el control de errores | ERROR |
Devolver un número de error | ERROR( ) |
Devolver una línea de programa en ejecución | LINENO( ) |
Devolver una cadena de mensajes de error | MESSAGE( ) |
Ejecutar un comando cuando se produce un error | ON ERROR |
Devolver comandos asignados a los comandos de control de errores | ON( ) |
Devolver el nombre del programa actualmente en ejecución | PROGRAM( ) o SYS(16) |
Volver a ejecutar el comando anterior | RETRY |
Devolver cualquier parámetro de mensaje de error actual | SYS(2018) |
Previsión de errores
La primera línea de defensa contra los errores en tiempo de ejecución es anticiparse y codificarlos antes de que ocurran. Por ejemplo, esta línea de código mueve el puntero al siguiente registro de la tabla:
SKIP
Este código funciona a menos que el puntero de registro ya esté situado detrás del último registro de la tabla y es en este punto donde se producirá el error.
Las líneas de código siguiente se anticipan a este error y lo evitan:
IF !EOF()
SKIP
IF EOF()
GO BOTTOM
ENDIF
ENDIF
Otro ejemplo es esta línea de código que muestra el cuadro de diálogo Abrir para permitir al usuario abrir una tabla en un área de trabajo nueva:
USE GETFILE('DBF') IN 0
El problema es que el usuario podría elegir Cancelar en el cuadro de diálogo Abrir o escribir el nombre de un archivo que no existe. El código siguiente se anticipa a esta situación comprobando que el archivo existe antes de que el usuario intente utilizarlo:
cNewTable = GETFILE('DBF')
IF FILE(cNewTable)
USE (cNewTable) IN 0
ENDIF
El usuario final también podría escribir el nombre de un archivo que no sea una tabla de Visual FoxPro. Para solucionar este problema, podría abrir el archivo con las funciones de E/S de archivo a bajo nivel, analizar el encabezado binario y comprobar que el archivo es una tabla válida. Sin embargo, esto implica algo de trabajo y podría hacer que la aplicación se ejecutara mucho más lentamente. Lo mejor sería controlar la situación durante el tiempo de ejecución mostrando un mensaje como “Abra otro archivo. Este archivo no es una tabla.” cuando se produzca el error 15, “No es una tabla”.
No puede, y probablemente tampoco lo desee, prever todos los errores posibles, por lo que tendrá que interceptar algunos con código que se ejecutará en caso de que se produzca un error en tiempo de ejecución.
Controlar errores de procedimientos
Cuando se produzca un error en el código de procedimientos, Visual FoxPro comprobará el código de control de errores asociado a una rutina ON ERROR. Si no existe ninguna rutina ON ERROR, Visual FoxPro muestra el mensaje de error predeterminado de Visual FoxPro. Para obtener una lista completa de los mensajes de error de Visual FoxPro y los números de error, vea la Ayuda.
Crear una rutina ON ERROR
Puede incluir cualquier comando o expresión válida de FoxPro después de ON ERROR, pero normalmente se llama a un procedimiento o programa de control de errores.
Para ver el funcionamiento de ON ERROR, puede escribir en la ventana Comandos un comando irreconocible, como:
qxy
Aparecerá un cuadro de diálogo de mensaje de error estándar de Visual FoxPro que indica “No se reconoce el verbo de comando”. No obstante, si ejecuta las líneas de código siguientes, aparecerá el error número 16 impreso en la ventana Resultados activa en lugar de mostrarse el mensaje de error estándar en un cuadro de diálogo:
ON ERROR ?ERROR()
qxy
Si se ejecuta ON ERROR sin escribir nada más, se restablecerán los mensajes de error integrados de Visual FoxPro:
ON ERROR
De forma esquemática, el código siguiente ilustra un controlador de errores ON ERROR:
LOCAL lcOldOnError
* Save the original error handler
lcOldOnError = ON("ERROR")
* Issue ON ERROR with the name of a procedure
ON ERROR DO errhandler WITH ERROR(), MESSAGE()
* code to which the error handling routine applies
* Reset the original error handler
ON ERROR &lcOldOnError
PROCEDURE errhandler
LOCAL aErrInfo[1]
AERROR(aErrInfo)
DO CASE
CASE aErrInfo[1] = 1 && File Does Not Exist
* display an appropriate message
* and take some action to fix the problem.
OTHERWISE
* display a generic message, maybe
* send high priority mail to an administrator
ENDPROC
Controlar errores en clases y objetos
Cuando se produce un error en el código del método, Visual FoxPro comprueba el código de control de errores asociado al evento Error del objeto. Si no se ha escrito código a nivel del objeto para el evento Error, se ejecuta el código del evento Error heredado de la clase principal o de otra clase superior de la jerarquía de clases. Si no se ha escrito código para el evento Error en ninguna clase de la jerarquía, Visual FoxPro comprueba la existencia de una rutina ON ERROR. Si no existe ninguna rutina ON ERROR, Visual FoxPro muestra el mensaje de error predeterminado de Visual FoxPro.
En las clases puede encapsularse todo lo que necesita un control, incluido el control de errores para que el control pueda utilizarse en diversos entornos. Si posteriormente descubre otro error que podría encontrar el control, puede agregar la gestión de ese error a la clase; de este modo, todos los objetos basados en la clase heredarán automáticamente la función de control del nuevo error.
Por ejemplo, la clase vcr
de la biblioteca de clases Buttons.vcx, ubicada en el directorio ...\Samples\Classes de Visual FoxPro se basa en la clase de contenedor de Visual FoxPro.
Cuatro botones de comandos del contenedor controlan el desplazamiento por la tabla moviendo el puntero de registro en una tabla con los comandos siguientes:
GO TOP
SKIP - 1
SKIP 1
GO BOTTOM.
Podría producirse un error si un usuario elige uno de los botones y no hay ninguna tabla abierta. Visual FoxPro intenta escribir en una tabla valores almacenados en el búfer cuando se mueve el puntero de registro. Por tanto, podría producirse un error si se habilita el almacenamiento optimista de filas en búfer y otro usuario ha cambiado un valor en el registro almacenado en el búfer.
Estos errores podrían producirse cuando el usuario elige cualquiera de los botones; por tanto, no tiene sentido tener cuatro métodos diferentes de control de errores. El código siguiente asociado al evento Error de cada uno de los botones de comando transfiere la información del error a una sola rutina de control de errores de la clase:
LPARAMETERS nError, cMethod, nLine
THIS.Parent.Error(nError, cMethod, nLine)
El código siguiente está asociado al evento Error de la clase vcr
. El código real es diferente debido a los requisitos de codificación para la localización.
Parameters nError, cMethod, nLine
DO CASE
CASE nError = 13 && Alias not found
cNewTable = GETFILE('DBF')
IF FILE(cNewTable)
SELECT 0
USE (cNewTable)
This.SkipTable = ALIAS()
ELSE
This.SkipTable = ""
ENDIF
CASE nError = 1585 && Data Conflict
* Update conflict handled by a datachecker class
nConflictStatus = ;
THIS.DataChecker1.CheckConflicts()
IF nConflictStatus = 2
MESSAGEBOX "Can't resolve a data conflict."
ENDIF
OTHERWISE
* Display information about other errors.
cMsg="Error:" + ALLTRIM(STR(nError)) + CHR(13) ;
+ MESSAGE()+CHR(13)+"Program:"+PROGRAM()
nAnswer = MESSAGEBOX(cMsg, 2+48+512, "Error")
DO CASE
CASE nAnswer = 3 &&Abort
CANCEL
CASE nAnswer = 4 &&Retry
RETRY
OTHERWISE && Ignore
RETURN
ENDCASE
ENDCASE
Es posible que desee estar seguro de que suministra información para un error que nunca ha controlado. De lo contrario, el código del evento de error se ejecutará pero no realizará ninguna acción y ya no se mostrará el mensaje de error predeterminado de Visual FoxPro. El resultado es que ni el programador ni el usuario sabrán lo que ha sucedido.
Dependiendo de los usuarios a los que esté destinada la aplicación, podría suministrar más información en el caso de un error no controlado, como el nombre y número de teléfono de la persona a la que se puede solicitar ayuda.
Retorno desde el código de control de errores
Después de ejecutarse el código de control de errores, se ejecuta la línea de código que sigue a la que ha producido el error. Si desea volver a ejecutar la línea de código que ha producido el error cuando haya cambiado la situación que lo ha producido, use el comando RETRY.
Nota Puede llamar al evento Error cuando el error encontrado no esté asociado a una línea del código. Por ejemplo, si llama al método CloseTables de un entorno de datos cuando AutoCloseTables está establecido como verdadero (.T.) y se libera el formulario, se generará un error interno cuando Visual FoxPro intente volver a cerrar las tablas. Puede interceptar este error, pero no existe ninguna línea de código para ejecutar RETRY.
Utilizar las rutinas de cierre de sesión
Puede crear su propia rutina de cierre de sesión si incluye el comando ON SHUTDOWN en el código. Normalmente, ON SHUTDOWN utiliza un comando DO para llamar a una rutina si intenta salir de la aplicación, como en este ejemplo:
ON SHUTDOWN DO My_Shutdown
Esta rutina suele incluir un cuadro de diálogo que pregunta al usuario si realmente desea salir de la aplicación actual. Si el usuario desea salir de la aplicación, la rutina puede cerrar los archivos abiertos y limpiar el entorno y posteriormente ejecutar el comando QUIT. Si el usuario no desea salir de la aplicación actual, la rutina puede devolver el control a la aplicación.
Vea también
Registrar el trayecto del código | Mostrar resultados | Probar y depurar aplicaciones | ON ERROR | Mostrar los valores almacenados