Al programar una aplicación, es posible que necesite saber en qué parte de su código se encuentra, especialmente cuando un método llama a otros métodos, que a su vez pueden llamar a otros métodos. Por eso es muy útil ver la cadena de métodos, o la cadena de llamadas, durante el proceso de depuración. Para ello, 4D v17 R6 proporciona el nuevo comando Get call chain para darle una visión del código ejecutado. Ahora ya no tendrá que preocuparse por perderse.
El comando devuelve una colección de objetos. Cada objeto representa un paso de ejecución descrito por su base de datos, tipo de método, nombre del método y línea de llamada. Puede utilizarse en todos los contextos de ejecución de código, tanto en modo interpretado como compilado.
EJEMPLO
Así, encontrar el origen de un error se vuelve muy fácil. Vea la siguiente cadena de llamadas con 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))
Y aquí están los 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. ¿Cómo podemos leer esto? Es bastante sencillo:
- El registro ha sido escrito en la tercera línea del método onError de la base de datos anfitriona,
- que fue llamado por la tercera línea del método openDocument de la base de datos anfitriona,
- Que fue llamado por la segunda línea del método executeHostMethod de la base de datos del componente,
- Que fue llamado por la primera línea del método del objeto de formulario detailForm.openButton de la base de datos del host,
- Que fue llamado por la tercera línea del método showDetailForm de la base de datos anfitriona.
CASOS DE USO
Hay diferentes casos de uso para este comando, aquí están algunos:
- Comprobación de errores – Probablemente ya utiliza métodos «on error» que incluyen un sistema de registro de errores. Antes de 4D v17 R6, sólo podía recuperar el código de error, el método de error y la línea que generaba el error. Si el método es llamado desde varios lugares en su código, podría ser bastante difícil entender el contexto que generó el error. Ahora puede recuperar toda la cadena de llamadas.
- Análisis – Un método es llamado desde varios otros métodos y usted quiere saber dónde es llamado más a menudo, en un entorno de producción. Ahora puede registrar la cadena de llamadas al método y analizar los resultados más tarde, sin tener que escribir docenas de líneas de código. Para evitar la ralentización del rendimiento, simplemente no utilice el comando en todos sus métodos.
- NO PARA EL DESARROLLO CONDICIONAL – Tenga en cuenta que esta característica es para propósitos de depuración y/o optimización. NO es para el desarrollo condicional basado en métodos de llamada.
COMPROBACIÓN DE RANGOS
Get call chain puede ejecutarse tanto en modo interpretado como compilado. El comando requiere información extra producida por el compilador 4D cuando la comprobación de rangos está activada. Dado que desactivar esta opción podría ser peligroso (provocando fallos), la hemos eliminado de la configuración de la base de datos. De esta manera, siempre está activada.
Sin embargo, puede seguir utilizando los comentarios correspondientes en su código aprobado y robusto:
- //%R- para desactivar la comprobación de rangos de la línea
- //%R+ para activar la comprobación de rangos desde la línea