Recuperar a actual cadeia de chamadas de execução

Tradução automática de Deepl

Ao programar uma aplicação, poderá precisar de saber onde se encontra no seu código, especialmente quando um método chama outros métodos, que podem então chamar outros métodos. É por isso que é muito útil ver a cadeia de métodos, ou a cadeia de chamadas, durante o processo de depuração. Para isso, 4D v17 R6 fornece a nova Get call chain comando para lhe dar uma visão do código executado. Agora já não terá de se preocupar em se perder!

O comando devolve uma colecção de objectos. Cada objecto representa uma etapa de execução descrita pela sua base de dados, tipo de método, nome do método, e linha de chamada. Pode ser utilizado em todos os contextos de execução do código, tanto no modo interpretado como no modo compilado.

EXEMPLO

Assim, encontrar a origem de um erro torna-se muito fácil. Veja a seguinte cadeia de chamadas com ON ERR CALL:

C_OBJECT
// Store the error in a file located in the database logs folder
$fileFolderfk logs folder($error;$file)
C_COLLECTION ($_callChain)

$_callChain :=Get call chain

$error :=New object
$error .timestamp:=Timestamp
$error .method:=Error method
$error .error:=Error

$error.line:=Error line
$error.deep:=$_callChain.length
$error.callChain:=$_callChain
xml-file("error_"+Generate UUID+".json")
$file .setText(JSON Stringify($error))

E aqui estão alguns resultados:

[{
    "timestamp": "2019-05-21T21:54:16.748Z",
    "method": "openDocument",
    "error": -43,
    "line": 3,
    "deep": 5,
    "callChain": [{
        "type": "projectMethod",  
        "name": "onError",
        "line": 3,
        "database": "Host_Database"
    }, {
        "type": "projectMethod",  
        "name": "openDocument",
        "line": 3,
        "database": "Host_Database"
    }, {
        "type": "projectMethod",  
        "name": "executeHostMethod",
        "line": 2,
        "database": "Component_Database"
    }, {
        "type": "formObjectMethod",  
        "name": "detailForm.openButton",
        "line": 1,
        "database": "Host_Database"
    }, {
        "type": "projectMethod",  
        "name": "showDetailForm",
        "line": 7,
        "database": "Host_Database"
    }]
}]

Ok. Então, como podemos ler isto? É bastante simples:

  • O registo foi escrito na terceira linha da base de dados anfitriã do métodoError,
  • Foi chamado pela terceira linha do método openDocument da base de dados anfitriã,
  • Que foi chamado pela segunda linha da base de dados de componentes do método executeHostMethod,
  • Que foi chamado pela primeira linha da base de dados do hospedeiro detailForm.openButton form object method,
  • Que foi chamado pela terceira linha da base de dados anfitriã showDetailForm método.

CASOS DE UTILIZAÇÃO

Existem diferentes casos de uso para este comando, aqui estão apenas alguns:

  • Verificação de erros – Provavelmente já utiliza métodos “on error” que incluem um sistema de registo de erros. Antes do 4D v17 R6, só se podia recuperar o código de erro, o método de erro, e a linha que gera o erro. Se o método for chamado de vários locais no seu código, poderá ser bastante difícil compreender o contexto que gerou o erro. Agora pode recuperar toda a cadeia de chamadas!
  • Análise – Um método é chamado a partir de vários outros métodos e quer saber onde é chamado com mais frequência, num ambiente de produção. Agora pode registar a cadeia de chamadas do método e analisar os resultados mais tarde, sem escrever dezenas de linhas de código. Para evitar abrandar o desempenho, simplesmente não use o comando em todos os seus métodos!
  • NÃO PARA DESENVOLVIMENTO CONDICIONAL – Tenha em mente que esta funcionalidade é para fins de depuração e/ou optimização. NÃO é para o desenvolvimento condicional baseado em métodos de chamada.

VERIFICAÇÃO DE LINHAS

Get call chain pode ser executado tanto em modo interpretado como compilado. O comando requer informação extra produzida pelo Compilador 4D quando a verificação do alcance é ligada. Uma vez que desactivar esta opção pode ser perigoso (resultando em crashes), removemo-la das definições da base de dados. Desta forma, é sempre activada.

Contudo, ainda pode utilizar os comentários correspondentes no seu código aprovado e robusto:

  • //%R- para desactivar a verificação do intervalo a partir da linha
  • //%R+ para activar a verificação do intervalo a partir da linha
Avatar
• Proprietário do produto - Damien Fuzeau entrou ao time 4D Product em fevereiro de 2019. Como Proprietário do Produto, está a cargo de escrever as histórias dos usuários e depois traduzi-las em especificações funcionais. Seu papel também é garantir que a implementação da funcionalidade entregue cumpra com as necessidades do cliente. Damien é formado em engenharia de software pela Universidade de Nantes. Trabalhou mais de 23 anos em sua empresa anterior, primeiro como desenvolvedor (descobrindo 4D em 1997), e mais tarde como gerente de engenharia e arquiteto de software. Essa empresa é um Partner OEM de 4D e lançou softwares empresariais baseados em 4D para milhares de usuários em centenas de servidores. Portanto Damien está acostumado ao desenvolvimento e lançamento de 4D em contextos multilinguais.