Les blocs de code Try-Catch dévoilés !

Après avoir implémenté la commande throw() et introduit le mot-clé Try(Expression), nous sommes ravis de dévoiler la prochaine évolution du système de gestion des erreurs de 4D : l’introduction des blocs de code Try-Catch!

À partir de 4D 20 R5, les utilisateurs peuvent améliorer leurs capacités de traitement des erreurs en exploitant la puissance des nouveaux mots-clés Try, Catch et End try.
Pour illustrer l’application pratique de ces nouveaux mots-clés, explorons un exemple impliquant la création de factures avec des lignes de facture. Cet exemple mettra en évidence les avantages immédiats de ces nouveaux mots-clés :

Function createInvoice($customer : cs.customerEntity; $items : Collection; $invoiceRef : Text) : cs.invoiceEntity
  var $newInvoice : cs.invoiceEntity
  var $newInvoiceLine : cs.invoiceLineEntity
  var $item : Object
 
  ds.startTransaction()
  Try
    $newInvoice:=This.new()
    $newInvoice.customer:=$customer
    $newInvoice.invoiceRef:=$invoiceRef
    For each ($item; $items)
      $newInvoiceLine:=ds.invoiceLine.new()
      $newInvoiceLine.item:=$item.item
      $newInvoiceLine.amount:=$item.amount
      $newInvoiceLine.invoice:=$newInvoice
      $newInvoiceLine.save()
    End for each
    $newInvoice.save()
    ds.validateTransaction()
  Catch
    ds.cancelTransaction()
    $newInvoice:=Null
    ds.logErrors({\
      message: "Invoice creation failed";\
      errors: Last errors;\
      customer$customer.ID;\
      invoiceRef: $invoiceRef;\
      items: $items\
      })
  End try
  return $newInvoice

Dans le processus de création de cet exemple, le développeur ne se préoccupe pas de l’endroit exact où une erreur se produit. Il souhaite simplement enregistrer l’erreur et s’assurer qu’il n’a pas créé de données invalides.
La fonction reçoit comme paramètres l’entité client, la collection d’articles et la référence de la facture.
Une transaction est démarrée au début pour protéger l’intégrité des données pendant le processus de création.
Tout le code de création est protégé dans un bloc de code Try.
Si la facture et les lignes de facture ont été créées sans erreur, la transaction est validée à la fin du bloc de code Try.
Mais si une erreur se produit, le bloc de code Catch est exécuté à l’endroit où elle s’est produite dans le bloc de code Try. Dans le bloc de code Catch, la transaction est annulée et l’erreur est enregistrée par une fonction personnalisée.

 

Les blocs de code Try-Catch en détail

Pour protéger l’exécution d’un bloc de code contre l’affichage d’une boîte de dialogue d’erreur 4D, vous pouvez désormais l’entourer des mots-clés Try et End try.
La gestion des erreurs n’est pas obligatoire, mais c’est mieux ! Vous pouvez donc insérer un mot-clé Catch avant le mot-clé End try et écrire le code de gestion des erreurs sur plusieurs lignes entre les mots-clés Catch et End try. Cette pratique est courante dans d’autres langages et rend les méthodes/fonctions longues plus faciles à lire !

Lorsqu’aucune erreur n’est déclenchée pendant l’exécution du bloc de code Try, le code saute le bloc de code Catch, s’il y en a un, et continue après le mot-clé End try.
Mais lorsqu’une erreur est déclenchée par n’importe quelle ligne de code dans le bloc de code Try:

  1. S’il est installé, le gestionnaire d’erreur actuel n’est pas appelé.
  2. La boîte de dialogue d’erreur 4D ne s’affiche pas.
  3. L’erreur est ajoutée à la pile d’erreurs courante.
  4. L’exécution du code passe immédiatement au bloc de code Catch. Si le mot-clé Catch est absent, l’exécution du code passe immédiatement après le mot-clé End try correspondant.

 

Notez que si aucun gestionnaire d’erreur n’est défini pour le contexte d’exécution actuel et qu’une erreur est déclenchée pendant l’exécution du bloc de code Catch, la boîte de dialogue d’erreur 4D s’affiche. Mais vous pouvez également utiliser Try(Expression) ou des blocs de code Try-Catch imbriqués pour éviter l’affichage de la boîte de dialogue d’erreur 4D !

 

À propos de la pile d’erreurs

Avant que la première ligne du bloc de code Try ne soit exécutée, la pile d’erreurs courante est effacée. Ce comportement est bénéfique dans la plupart des cas, car cela évite de comparer la pile d’erreurs avant et après l’exécution pour détecter de nouvelles erreurs.
Par conséquent, si vous souhaitez insérer un bloc de code Try-Catch dans un bloc de code Catch et récupérer la totalité de la pile d’erreurs, n’oubliez pas de la stocker au préalable dans une collection, comme dans cet exemple :

var $errors : Collection
Try
  throw(123; "First error")
Catch
  $errors.push(Last errors)
  Try
    throw(456; "Second error")
  Catch
    $errors.push(Last errors)
    // La collection $errors contient les deux erreurs précédentes
  End try
End try

 

UTILISATION avec la gestion globale des erreurs

La gestion des erreurs à l’aide de la commande ON ERR CALL est toujours d’actualité. Elle peut être utilisée efficacement avec les blocs de code Try(Expression) et Try-Catch. Il suffit de garder à l’esprit la priorité de la gestion des erreurs :

  1. Try(Expression). C’est la méthode la plus précise car elle permet de vérifier les erreurs provoquées par une seule ligne.
  2. Blocs de code Try-Catch. C’est la meilleure façon de procéder lorsque vous considérez que la vérification des erreurs ligne par ligne n’est pas pertinente.
  3. ON ERR CALL commande avec l’option par défaut ek local pour détecter les erreurs non gérées dans l’exécution de code à venir dans le process/worker courant.
  4. ON ERR CALL commande avec les options ek global et ek errors from components pour détecter les erreurs partout où un système de gestion des erreurs n’a pas été installé ou codé.

 

N’oubliez pas que les principaux avantages du codage de la gestion des erreurs avec les blocs de code Try(Expression) ou Try-Catch sont les suivants :

  • placer la gestion des erreurs aussi près que possible du code qui génère les erreurs
  • utiliser des variables locales dans le code de gestion des erreurs

 

Vous avez maintenant toutes les cartes en main pour gérer les erreurs comme vous le souhaitez, ce qui rend votre code plus sûr !

Nous nous efforçons de fournir à nos utilisateurs la meilleure expérience possible, et nous vous encourageons à partager vos idées et vos commentaires sur le forum 4D. Vos commentaires nous aident à comprendre vos besoins et à améliorer continuellement nos produits et services.
Bon codage !

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.