18 de marzo de 2016

Control estructurado de errores con los errores de NEWOBJECT

Artículo original: Structured error handling with NEWOBJECT errors
http://www.spacefold.com/colin/posts/2005/10-04TRY-CATCHvsNEWOBJECT.html
Autor: Colin Nicholls
Traducido por: Ana María Bisbé York



Marcus escribió un artículo muy bueno sobre el control de errores estructurado en VFP 8.0 con TRY-CATCH y versiones posteriores. Me llamó la atención una sección en particular debido a que se refiere a un problema que yo tuve recientemente.

[..] el resultado es el contrario al ejemplo anterior. El evento Error() tiene preferencia sobre el Try/Catch y controla el error dentro del objeto llamado.

¿Qué pasaría entonces si agregamos control estructurado al objeto TestClass?

DEFINE CLASS TestClass AS CUSTOM
FUNCTION Execute
  TRY
    xxxxxx
  CATCH
    MESSAGEBOX("EXCEPTION 2!")
  ENDTRY
ENDFUNC
FUNCTION ERROR(nError, cMethod, nLine)
  MESSAGEBOX(MESSAGE())
ENDFUNC
ENDDEFINE

En este caso, el nuevo Try/Catch va a controlar el error, ya que fue definido en el nivel superior.

Esto no es estricto en todos los casos. Considere el siguiente código:

PROCEDURE Execute
  TRY
    *-----------------------------------------
    * Esto está controlado por el comando
    * TRY_CATCH que lo envuelve:
    *-----------------------------------------
    Y = NEWOBJECT("invalidClass")
    *-----------------------------------------
    * Este ignora el TRY-CATCH y
    * desencadena el evento .Error():
    *-----------------------------------------
    THIS.NEWOBJECT(SYS(2015), "invalidClass", "invalidLib.vcx" )
  CATCH
    MESSAGEBOX("Capturamos satisfactoriamente el ERROR en el CATCH.",64 )
  ENDTRY
ENDPROC
PROCEDURE ERROR(p1, p2, p3 )
  MESSAGEBOX("En su lugar se desencadena el evento ERROR() del objeto!",16)
ENDPROC
ENDDEFINE

El control de errores estructurado funciona según lo previsto para la función NEWOBJECT(), atrapando satisfactoriamente el error "clase no encontrada". Sin embargo, la llamada al método This.NewObject() va a forzar que se dispare el evento Error del objeto, lo que requiere una configuración completamente diferente de código de control de errores para quitar este error. Esto no es un bug, es la forma en la que trabaja el objeto. Los objetos siempre trasladan a su propio evento Error() el control de errores. Es molesto ¿verdad que si?

No hay comentarios. :

Publicar un comentario