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