defer
defer ( exitFormula : Expression )
| Parámetro | Tipo | Descripción | |
|---|---|---|---|
| exitFormula | Expression | → | Expresión a ejecutar al salir |
Historial
| Versión | Cambios |
|---|---|
| 21 R4 | Creado |
Descripción
El comando defer declara una expresión exitFormula que siempre se ejecutará al salir del método o de la función, incluso si se ha lanzado un error o se ha ejecutado un return. Usar defer le permite garantizar que un método o una función termine correctamente ejecutando el código de finalización al salir. Además, este comando evita duplicar el mismo código de salida en cada bloque de retorno o de captura de errores.
El comando defer puede llamarse en cualquier parte del código de un método o de una función, y puede insertar tantas expresiones defer como desee. Durante la ejecución, todas las expresiones exitFormula encontradas se apilan. Cuando se detiene la ejecución, sea cual sea el motivo (flujo normal, break, error, interrupción del usuario, return...), todas las expresiones de la pila diferida se desapilan y se ejecutan en orden LIFO (Last In First Out).
Por ejemplo:
defer(ALERT("1"))
defer(ALERT("2"))
// Al salir, las alertas mostrarán "2" y luego "1"
En exitFormula, pase la expresión que desea evaluar al salir del método o de la función, sin importar cómo haya terminado. Internamente, cada vez que se llama a defer, 4D convierte exitFormula en una formula y la añade a una pila asociada al método o a la función. Cuando finaliza el método o la función, todas las fórmulas almacenadas en la pila se evalúan en el orden en que aparecen en la colección.
Para fines de depuración, puede obtener la pila actual de fórmulas en cualquier momento utilizando el comando Deferred formulas.
Como ocurre con todas las formulas, si la expresión exitFormula usa variables locales, sus valores actuales se copian y se almacenan en el objeto fórmula devuelto cuando se coloca en la pila diferida. Al ejecutarse, la fórmula utiliza esos valores copiados en lugar de los valores actuales de las variables locales.
- Tenga en cuenta que las variables locales almacenan referencias para los valores de tipo object y collection.
- Si exitFormula contiene otra instrucción
defer, se genera un error.
Si la expresión exitFormula genera un error, este se intercepta e ignora automáticamente y el flujo de ejecución continúa sin interrupción.
Ejemplo 1
Estos ejemplos ilustran las distintas expresiones exitFormula compatibles:
// Llamada de método
defer(aMethod)
// Llamada de una función de objeto
defer(myObject.aFunction(something))
// Llamada de una función singleton
defer(cs.aClass.me.aFunction(something))
Ejemplo 2
Quiere asegurarse de que una referencia XML siempre se libere correctamente, para evitar posibles fugas de memoria:
var $xmlRef:=DOM Create XML ref("theRoot")
defer(DOM CLOSE XML($xmlRef))
...
Ejemplo 3
Quiere asegurarse de que la supervisión de actividad se detenga al final del método:
START MONITORING ACTIVITY(0.001;Activity all)
defer(STOP MONITORING ACTIVITY())
...
Ejemplo 4
Quiere controlar la generación de registros:
$logRecording:=Get database parameter(Diagnostic log recording)
SET DATABASE PARAMETER(Diagnostic log recording; 1)
defer(SET DATABASE PARAMETER(Diagnostic log recording; $logRecording))
$logLevel:=Get database parameter(Diagnostic log level)
SET DATABASE PARAMETER(Diagnostic log level; Log trace)
defer(SET DATABASE PARAMETER(Diagnostic log level; $logLevel))
Ver también
Deferred formulas
Last errors
ON ERR CALL
Propiedades
| Número de comando | 1805 |
| Hilo seguro | no |