A partir de Visual FoxPro 8 existe una nueva estructura de control TRY...CATCH...FINALLY para capturar errores o excepciones que ocurren en tiempo de ejecución.
La estructura TRY...CATCH...FINALLY comienza con una cláusula TRY que marca el inicio de un bloque TRY. En este bloque se puede especificar un grupo de cláusulas que pueden producir un error en tiempo de ejecucion. Si el programa completa el bloque TRY sin generar ninguna excepción, este salta el bloque CATCH y busca el bloque FINALLY y ejecuta las sentencias de ese bloque. Si el bloque FINALLY no existe, el programa ejecuta la primera sentencia despues de la clausula ENDTRY que marca el final de la estructura TRY...CATCH...FINALLY
Capturando el error
Cuándo el error ocurre, el código lanza (THROW) una excepción, el programa ejecuta la primera sentencia del bloque CATCH que maneja dicha excepción.
El programa examina las sentencias CATCH en la orden que estas aparecen para ver si una de ellas pueden manejar la excepción. Si el programa encuentra una sentencia CATCH que maneja la excepción, el programa ejecuta el código correspondiente.
La sentencia CATCH puede contener las clausuals opcionales TO y WHEN. Uno puede especificar una variable de memoria en la cláusula TO para almacenar una referencia a un objeto Exception (nuevo en Visual FoxPro 8), que se crea sólo cuando una excepción ocurre. Si se quiere establecer una condición para ejecutar un bloque CATCH, se puede especificar una expresión en la cláusula WHEN que se debe evaluar Verdadero (.T.) antes de que el bloque CATCH se ejecute.
Las sentencias CATCH trabajan similarmente como una sentencia DO CASE en el que la cláusula WHEN debe evaluar a una expresión lógica. Si las cláusulas TO y WHEN no existen, la sentencia CATCH se evalúa como CATCH WHEN .T. (Verdadero).
Después que el programa ejecuta las sentencias en un bloque CATCH, no vuelve a la sentencia TRY, y no busca otras declaraciones CATCH. El programa busca el bloque FINALLY, si este existe. Si no existe el programa ejecuta la sentencia inmediatemente despues de la clausula ENDTRY. El bloque FINNALY se ejecuta se haya o no generado una excepción.
Sintaxis y ejemplo
Esta es la sintaxis de la estructura de control TRY...CATCH...FINALLY
TRY [tryCommands] [CATCH [TO VarName] [WHEN lExpression] [catchCommands]] [THROW eUserExpression] [EXIT] [FINALLY [finallyCommands]] ENDTRY
Un breve ejemplo del uso de TRY...CATCH...FINALLY
CLEAR LOCAL ln AS Integer, lc AS Character LOCAL lo AS Exception TRY ? "-- TRY --" SELECT 0 USE "TablaNoExistente" ALIAS "MiTabla" GO BOTT ln = MiTabla.nCampo lc = MiTabla.cCampo ? ln ? lc CATCH TO lo && objeto Exception ? "-- CATCH --" lo.UserValue = "Aquí hay un error" ? ' Comment: ', lo.COMMENT ? ' Details: ', lo.Details ? ' ErrorNo: ', lo.ErrorNo ? ' LineContents: ', lo.LineContents ? ' LineNo: ', lo.LINENO ? ' Message: ', lo.MESSAGE ? ' Procedure: ', lo.PROCEDURE ? ' UserValue: ', lo.UserValue ? ' StackLevel: ', lo.StackLevel FINALLY ? "-- FINALLY --" IF USED("MiTabla") USED IN "MiTabla" ENDIF ENDTRY ? "-- ENDTRY --"
Prioridad de los manejos de errores
Si un error ocurre en el método de un objeto que se llama en un bloque TRY, Visual FoxPro sigue el procedimiento del manejo del error para ese objeto particular. Este protocolo proporciona una manera para mantener una encapsulation y control de los componentes.
Por ejemplo, si la línea MiForm.Refresh() en un bloque TRY genera un error, si el método Error existe para manejar el error, entonces el método Error toma la precedencia. Si ningún método Error existe, entonces la sentencia CATCH procura manejar el error.
Veamos algunos ejemplos de estas prioridades:
Ejemplo 1: La clase MiClase posee un método Error, y este toma precedencia al generarse un error.
CLEAR lo = CREATEOBJECT("MiClase") lo.MiMetodo1() DEFINE CLASS MiClase AS CUSTOM PROCEDURE MiMetodo1 TRY THIS.MiMetodo2() CATCH TO loErr ? "-- CATCH --" ? "ErrorNo:", loErr.ErrorNo ? "LineNo:", loErr.LINENO ? "Procedure:", loErr.PROCEDURE ? "Message:", loErr.MESSAGE ENDTRY ENDPROC PROCEDURE MiMetodo2 ? PROGRAM() *-- La variable luY no existe. El evento ERROR maneja este error. luX = luY ENDPROC PROCEDURE ERROR(nError, cProcedure, nLine) ? "-- ERROR --" ? "ErrorNo:", nError ? "LineNo:", nLine ? "Procedure:", cProcedure ? "Message:", MESSAGE() ENDPROC ENDDEFINE
Ejemplo 2: La clase MiClase no posee un método Error, en esta caso el manejo de error lo maneja la claúsula CATCH.
CLEAR lo = CREATEOBJECT("MiClase") lo.MiMetodo1() DEFINE CLASS MiClase AS CUSTOM PROCEDURE MiMetodo1 TRY THIS.MiMetodo2() CATCH TO loErr ? "-- CATCH --" ? "ErrorNo:", loErr.ErrorNo ? "LineNo:", loErr.LINENO ? "Procedure:", loErr.PROCEDURE ? "Message:", loErr.MESSAGE ENDTRY ENDPROC PROCEDURE MiMetodo2 ? PROGRAM() *-- La variable luY no existe y *-- el método ERROR no existe. CATCH maneja este error. luX = luY ENDPROC ENDDEFINE
Mas información
Pueden ver mas información de la estructura de control TRY...CATCH...FINNALY en:
Fox.Wikis: http://fox.wikis.com/wc.dll?Wiki~TryCatch
No hay comentarios. :
Publicar un comentario
Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.