Es común para depurar problemas insertar un SET STEP ON antes de la porción de código con problemas, de esta manera puede ver lo que sucede en el Depurador.
Sin embargo, todos hemos experimentado el gran sentimiento de ser un verdadero profesional en nuestro arte cuando dejamos un SET STEP ON en el código de producción, sólo para tener nuestro fallo de la aplicación ("Caracteristica no disponible") durante una demostración o el producto final.
Algunos desarrolladores recurren a reemplazar el SET STEP ON puro por otro SET STEP ON diseñado para ser inofensivo en el código de producción. Un ejemplo es crear un archivo ficticio que sólo existe en la máquina local, quizás algo como este:
IF FILE("Debug.Txt") *** archivo ficticio no disponible en producción
SET STEP ON
ENDIF
Aquí está una idea que es más sencilla. Sólo sustituya el SET STEP ON por ASSERT .F. (incluya la cláusula MESSAGE si quiere):
ASSERT .F.
Cuando VFP encuentra un ASSERT .F. (asumo que SET ASSERT es ON, algo que es típicamente verdadero durante el desarrollo), esto da el diálogo ASSERT con la posibilidad de [Depuración], con la cual nos lleva al depurador.
La gran ventaja consiste en que VFP "automáticamente" ignora los ASSERTs en el código de producción compilado en un .EXE y también en un .DLL, donde sería aún más desastroso dejar un SET STEP ON. Por supuesto, en el código de producción también generalmente se emite un SET ASSERTS OFF, obteniendo una protección adicional incluida en el código fuente distribuido como .APPs y .FXPs.
Como se demuestra ejecutando el siguiente PRG, también puede usar esta técnica donde tiene el código que espera un potencial problema y atrapa los errores conocidos. ASSERTS da la oportunidad al desarrollador para ir inmediatamente a la Depuración en vez sólo darse cuenta que el código no se ejecutó como se esperaba.
Advierta que en VFP 7.0 SET STEP ON es ignorado en un .APP, .EXE ó .DLL - ningún error "Caracteristica no disponible" será generado, de esta manera activando en VFP 7.0 SET STEP ON, este es omitido en una aplicación distribuida, de la misma forma que ASSERT .F.
*
SET ASSERTS OFF
* para producción
SET ASSERTS ON
* para desarrollo
*
* Aquí va código ...
*
LOCAL lnJunk
lnJunk = 100
IF !OpenTable("AlgunaTablaQueNoExiste")
MESSAGEBOX("No se puede abrir AlgunaTablaQueNoExiste",16, ;
"Por favor informe este problema")
RETURN .f.
ENDIF
SELECT AlgunaTablaQueNoExiste
LOCATE FOR AlgunCampo = 100
*
* etc.
*
RETURN
*
PROCEDURE OpenTable
*
* pretendo que esto sea una utilidad separada
*
LPARAMETERS tcTable
LOCAL llError, lcOnError
lcOnError = ON("ERROR")
llError = .f.
ON ERROR llError = .t.
USE (tcTable) IN 0 SHARED
ON ERROR &lcOnError
IF llError
*
* asigne la posibilidad al desarrollador de ir directamente
* a la escena del crimen, en vez de solo un mensaje al
* usuario recibido en producción
*
ASSERT .F. MESSAGE "No se puede USAR " + tcTable
*
* Recuerde que ASSERT es omitido en un .EXE, .DLL,
* y/o cuando SET ASSERTS OFF
*
ENDIF
RETURN !llError
VFP Tips & Tricks - Drew Speedie