Récupérer la chaîne d’appel de l’exécution en cours

Traduit automatiquement de Deepl

Lorsque vous programmez une application, vous pouvez avoir besoin de savoir où vous en êtes dans votre code, notamment lorsqu’une méthode appelle d’autres méthodes, qui peuvent ensuite appeler d’autres méthodes. C’est pourquoi il est très utile de voir la chaîne des méthodes, ou la chaîne d’appel, pendant le processus de débogage. Pour cela, 4D v17 R6 fournit la nouvelle commande Get call chain pour vous donner un aperçu du code exécuté. Désormais, vous n’aurez plus à craindre de vous perdre !

La commande renvoie une collection d’objets. Chaque objet représente une étape d’exécution décrite par sa base de données, son type de méthode, son nom de méthode et sa ligne d’appel. Elle peut être utilisée dans tous les contextes d’exécution du code, aussi bien en mode interprété que compilé.

EXEMPLE

Ainsi, trouver la source d’une erreur devient très facile. Voyez la chaîne d’appel suivante avec 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))

Et voici quelques résultats :

[{
    "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. Alors comment pouvons-nous lire ceci ? C’est assez simple :

  • Le journal a été écrit à la troisième ligne de la méthode onError de la base de données hôte,
  • qui a été appelée par la troisième ligne de la méthode openDocument de la base de données hôte,
  • Qui a été appelée par la deuxième ligne de la méthode executeHostMethod de la base de données des composants,
  • qui a été appelée par la première ligne de la méthode de l’objet de formulaire detailForm.openButton de la base de données hôte,
  • qui a été appelée par la troisième ligne de la méthode showDetailForm de la base de données hôte.

CAS D’UTILISATION

Il existe différents cas d’utilisation de cette commande, en voici quelques-uns :

  • Vérification des erreurs – Vous utilisez probablement déjà les méthodes « on error » qui incluent un système de journal des erreurs. Avant 4D v17 R6, vous ne pouviez récupérer que le code d’erreur, la méthode d’erreur et la ligne générant l’erreur. Si la méthode est appelée à plusieurs endroits dans votre code, il pouvait être assez difficile de comprendre le contexte qui a généré l’erreur. Maintenant, vous pouvez récupérer la chaîne d’appel complète !
  • Analyse – Une méthode est appelée depuis plusieurs autres méthodes et vous voulez savoir où elle est appelée le plus souvent, dans un environnement de production. Vous pouvez maintenant enregistrer la chaîne d’appel de la méthode et analyser les résultats plus tard, sans écrire des dizaines de lignes de code. Pour éviter de ralentir les performances, il suffit de ne pas utiliser la commande dans toutes vos méthodes !
  • PAS POUR LE DÉVELOPPEMENT CONDITIONNEL – Gardez à l’esprit que cette fonctionnalité est destinée au débogage et/ou à l’optimisation. Elle n’est PAS destinée au développement conditionnel basé sur les méthodes de l’appelant.

VÉRIFICATION DE LA PORTÉE

Get call chain peut être exécuté à la fois en mode interprété et compilé. La commande requiert des informations supplémentaires produites par le compilateur 4D lorsque le contrôle d’étendue est activé. Comme la désactivation de cette option pouvait être dangereuse (entraînant des plantages), nous l’avons supprimée des paramètres de la base de données. De cette façon, elle est toujours activée.

Cependant, vous pouvez toujours utiliser les commentaires correspondants dans votre code approuvé et robuste :

  • //%R- pour désactiver la vérification de la portée de la ligne
  • //%R+ pour activer la vérification de la portée de la ligne
Avatar
- Product Owner -Damien Fuzeau a rejoint l'équipe 4D Product en février 2019. En tant que Product Owner, il est en charge de la rédaction des user stories, puis de leur traduction en spécifications fonctionnelles. Son travail consiste également à s'assurer que les implémentations de fonctionnalités livrées répondent aux besoins des clients.Damien est diplômé de l'Université de Nantes en génie logiciel. Il a passé plus de 23 ans dans son ancienne entreprise, d'abord en tant que développeur (découverte de 4D en 1997), puis en tant que responsable de l'ingénierie et architecte logiciel. Cette société est un partenaire OEM de 4D et a déployé des logiciels d'entreprise basés sur 4D pour des milliers d'utilisateurs, sur des centaines de serveurs. Damien est donc habitué au développement et au déploiement 4D dans un contexte multi-langues.