Saltar para o conteúdo principal
Versão: Próximo

defer

defer ( exitFormula : Expression )

ParâmetroTipoDescrição
exitFormulaExpressionExpressão a ser executada na saída
Histórico
VersãoAlterações
21 R4Criado

Descrição

O comando defer declara uma expressão exitFormula que sempre será executada quando o método ou a função terminar, mesmo que um erro tenha sido lançado ou que um return tenha sido executado. O uso de defer permite garantir que um método ou função termine corretamente executando código de finalização na saída. Além disso, esse comando evita duplicar o mesmo código de saída em cada bloco de retorno ou de tratamento de erro.

O comando defer pode ser chamado em qualquer lugar do código do método ou função, e você pode inserir quantas expressões defer quiser. Durante a execução, todas as expressões exitFormula encontradas são empilhadas. Quando a execução termina, seja qual for o motivo (fluxo normal, break, erro, interrupção do usuário, return...), todas as expressões da pilha diferida são desempilhadas e executadas em ordem LIFO (Last In First Out).

Por exemplo:

defer(ALERT("1"))
defer(ALERT("2"))
// Na saída, os alertas exibirão "2" e depois "1"

Em exitFormula, você passa a expressão que deseja avaliar na saída do método ou função, independentemente da forma de término. Internamente, toda vez que defer é chamado, o 4D converte exitFormula em uma formula e a adiciona a uma pilha associada ao método ou função. Quando o método ou função termina, todas as formulas armazenadas na pilha são avaliadas na ordem em que aparecem na coleção.

Para fins de depuração, você pode obter a pilha atual de fórmulas a qualquer momento usando o comando Deferred formulas.

Como para todas as formulas, se a expressão exitFormula usar variáveis locais, seus valores atuais são copiados e armazenados no objeto formula retornado no momento em que ele é colocado na pilha diferida. Quando executada, a formula usa esses valores copiados em vez dos valores atuais das variáveis locais.

Notas
  • Tenha em mente que variáveis locais armazenam referências para valores object e collection.
  • Se exitFormula contiver outra instrução defer, um erro será lançado.

Se a expressão exitFormula lançar um erro, ele é automaticamente interceptado e ignorado, e o fluxo de execução continua sem interrupção.

Exemplo 1

Estes exemplos ilustram as várias expressões exitFormula suportadas:

// Chamada de método
defer(aMethod)

// Chamada de função de objeto
defer(myObject.aFunction(something))

// Chamada de função singleton
defer(cs.aClass.me.aFunction(something))

Exemplo 2

Você quer garantir que uma referência XML seja sempre liberada corretamente, para evitar possíveis vazamentos de memória:

var $xmlRef:=DOM Create XML ref("theRoot")
defer(DOM CLOSE XML($xmlRef))
...

Exemplo 3

Você quer garantir que o monitoramento de atividade seja interrompido no final do método:

START MONITORING ACTIVITY(0.001;Activity all)
defer(STOP MONITORING ACTIVITY())
...

Exemplo 4

Você quer controlar a geração de logs:

$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 também

Deferred formulas Last errors
ON ERR CALL

Propriedades

throw

Número do comando1805
Thread-segurono