TRY-CATCH en VFP6

739 views
Skip to first unread message

Victor Espina

unread,
May 10, 2014, 1:45:11 PM5/10/14
to publice...@googlegroups.com
Ayer y hoy estuve adaptando una clase hecha para VFP9,  a fin de que ejecutara en VFP6.   Una de las cosas que tuve que cambiar fue el tema del uso del TRY-CATCH, ya que esos comandos no existen en VFP6.   Al hacer eso, termine con una libreria que permite aplicar un uso parecido al TRY-CATCH pero en VFP6.  Usando esta libreria, un codigo que luce asi en VFP9:

TRY
   comando

CATCH TO ex
   MESSAGEBOX(ex.Message)

ENDTRY


luciria asi en VFP6:

TRY()
  comando

IF CATCH(@ex)
  MESSAGEBOX(ex.MEssage)
ENDIF

ENDTRY()


En el caso de que el bloque TRY contuviera mas de un comando,  se puede usar una funcion especial para saber si la ultima instruccion genero un error o no:

TRY()
   Iniciar()
   IF NOEX()
     Terminar()
   ENDIF

IF CATCH(@ex)
   MESSAGEBOX(ex.Message)
ENDIF

ENDTRY()


Espero les sea de utilidad. Aca les dejo el codigo fuente:

* TRYCATCH.PRG
* Implementacion de bloques TRY-CATCH para VFP6
*
* Autor: Victor Espina
* Fecha: Mayo 2014
*

PROCEDURE TRY
 IF VARTYPE(gcTRYOnError)="U"
  PUBLIC gcTRYOnError,goTRYEx,goTRYNestingLevel
  goTRYNestingLevel = 0
 ENDIF
 gcTRYOnError = ON("ERROR")
 goTRYEx = NULL
 goTRYNestingLevel = goTRYNestingLevel + 1
 IF goTRYNestingLevel = 1
  ON ERROR tryCatch(ERROR(), MESSAGE(), MESSAGE(1), PROGRAM(), LINENO())
 ENDIF
ENDPROC

PROCEDURE CATCH(poEx)
 IF PCOUNT() = 1
  poEx = goTRYEx
 ENDIF
 RETURN !ISNULL(goTRYEx)
ENDPROC

PROCEDURE ENDTRY
 gnTRYNestingLevel = gnTRYNestingLevel - 1
 goTRYEx = NULL
 IF gnTRYNestingLevel = 0 
  IF !EMPTY(gcTRYOnError)
   ON ERROR &gcTRYOnError
  ELSE
   ON ERROR
  ENDIF
 ENDIF
ENDPROC

FUNCTION NOEX()
 RETURN ISNULL(goTRYEx)
ENDFUNC

PROCEDURE tryCatch(pnErrorNo, pcMessage, pcSource, pcProcedure, pnLineNo)
 goTRYEx = CREATE("Exception")
 WITH goTRYEx
  .errorNo = pnErrorNo
  .Message = pcMessage
  .Source = pcSource
  .Procedure = pcProcedure
  .lineNo = pnLineNo
 ENDWITH
ENDPROC

DEFINE CLASS Exception AS Custom
 errorNo = 0
 Message = ""
 Source = ""
 Procedure = ""
 lineNo = 0 
ENDDEFINE



Norberto

unread,
May 10, 2014, 4:12:52 PM5/10/14
to publice...@googlegroups.com
Muy bueno Victor. 
Gracias

HernanCano

unread,
May 11, 2014, 1:15:35 AM5/11/14
to publice...@googlegroups.com
Parce: mis respetos!!!

Hay alguna metodología que se comparte Internet para lo que mencionas, pero lo tuyo es más claro.

Sinceramente no soy hincha de TRY/CATCH, pero esta implementación que compartes me es plenamente clara; analizaré si la usaré.

Mis respetos, compa!!!

Victor Espina

unread,
May 11, 2014, 10:25:28 AM5/11/14
to publice...@googlegroups.com
Acabo de encontrar un bug en el codigo, asi que aqui va corregido:

* TRYCATCH.PRG
* Implementacion de bloques TRY-CATCH para VFP6
*
* Autor: Victor Espina
* Fecha: Mayo 2014
*

PROCEDURE TRY
IF VARTYPE(gcTRYOnError)="U"
 PUBLIC gcTRYOnError,goTRYEx,goTRYNestingLevel
 goTRYNestingLevel = 0
ENDIF

ZeRoberto

unread,
May 11, 2014, 11:42:44 AM5/11/14
to publicesvfoxpro
Y como haces para que se salte el bloque cuando ocurre un error, por ejemplo

Try
    Codigo1()
    Codigo2(2, "Cadena") && Error de Parámetros
    Codigo3()
    Codigo4()
    Codigo5()
Catch To loError
EndTry

Victor Espina

unread,
May 12, 2014, 10:11:29 AM5/12/14
to publice...@googlegroups.com
Try
   Codigo1()
   IF NOEX()
     
Codigo2(2, "Cadena")
&& Error de Parámetros
   ENDIF
   IF NOEX()
     
Codigo3()
   ENDIF
   IF NOEX()
     
Codigo4()
   ENDIF
   IF NOEX
()
     Codigo5()
   ENDIF

IF CATCH(@loError)
ENDIF

EndTry()


Obviamente no es tan optimo como el comando real.


Victor Espina

Carlos Miguel FARIAS

unread,
May 12, 2014, 10:50:37 AM5/12/14
to Grupo Fox
No te creas que el try catch real es más rápido en VFP 6, de hecho, su velocidad es cero. ;-D

Victor Espina

unread,
May 12, 2014, 12:27:35 PM5/12/14
to publice...@googlegroups.com
Me referia al hecho de tener que validar con IF NOEX() cada linea individual del bloque TRY, cosa que con el TRY real no es necesario.  Pero como dice la cancion: eso es lo que hay. :)

Victor 

James S

unread,
May 21, 2014, 5:44:17 PM5/21/14
to publice...@googlegroups.com
Yo me había inventado algo muy similar, pero utilizando archivos h, lo que hacía posible por decirlo así implementarlo como si fueran palabras clave del sistema. Eso sí te doy una recomendación, en el ENDTRY, si no se ha llamado al CATCH lanza el error, es más eficiente, porque puede darse que por error se olvide el CATCH y como desarrollador no sepa cual es el error. 

Victor Espina

unread,
May 21, 2014, 6:37:01 PM5/21/14
to publice...@googlegroups.com
Buen dato James. Lo tendre en cuenta.

Saludos

Victor Espina
Reply all
Reply to author
Forward
0 new messages