L4G >  Onerrgo  

Afficher tout Masquer tout

Onerrgo permet dans un traitement de déclarer une étiquette où se déroutera l'exécution du traitement en cas d'erreur.

 

Syntaxe

   Onerrgo [ étiquette ] [ From traitement ]

 

Paramètres

Elément

Description

Restrictions

étiquette

Etiquette de branchement en cas d'erreur.

Aucune.

traitement

Traitement dans lequel est définie l'étiquette (par défaut, il s'agit du traitement courant), sous l'une des formes suivantes :
nom_d'OBJet
'='
exp_nomtrt

Le traitement doit être accessible.

exp_nomtrt

Expression alphanumérique dont le résultat est un nom de traitement.

Le traitement doit être accessible.

 

Exemples

   # Ouverture d'un fichier avec gestion des erreurs (on aurait pu
   # tester l'existence du fichier par la fonction filinfo) suivie d'une
   # phase de calcul avec branchement sur une autre routine.
    FLAG_ERREUR=0
    # Si une erreur arrive, aller à l'étiquette PB_OUVERTURE
    OnerrgoPB_OUVERTURE From GESERR
    # Ouverture d'un fichier séquentiel
    Openi filpath("TXT","TEST","txt")
    # Si une erreur arrive en phase de calcul
    Onerrgo PB_CALCUL
    Gosub CALCUL
    # Plus de branchement sur erreur maintenant
    Onerrgo
    If FLAG_ERREUR
       # Arrêt si une erreur s'est produite
       End
    Endif
   #
    ... suite du traitement ...
   #

   (suite de l'exemple précédent)
   #  Routines de gestion d'erreur
   $PB_CALCUL
      Errbox "Erreur en phase de calcul"-errmes$(errn)
      FLAG_ERREUR = errn
    Resume : # Retour à la ligne suivant l'erreur
   #
   # Etiquette définie dans le traitement GESERR
   $PB_OUVERTURE
      Errbox "Problème d'ouverture du fichier en ligne"-errl
      Errbox "Erreur no"-errn-":"-errmes$(errn)
      FLAG_ERREUR = errn
    Resume : # Retour à la ligne suivant l'erreur

Description

Onerrgo permet de définir une étiquette où se déroute l'exécution d'un traitement en cas d'erreur. Après l'ordre Onerrgo, si une erreur se produit, la partie de traitement qui suit l'étiquette est exécutée.
Dans ce traitement d'erreur :

  • la fonction errn renvoie le numéro de l'erreur ;
  • la fonction errp renvoie le nom du traitement où l'erreur s'est produite ;
  • la fonction errl renvoie le numéro de la ligne du traitement où l'erreur s'est produite ;
  • la fonction errm renvoie la deuxième partie du message d'erreur ;
  • l'instruction Resume qui termine un traitement d'erreur permet de reprendre l'exécution à l'instruction suivant celle où s'est produite l'erreur ;
  • entre le déroutement d'erreur et le Resume, il n'y a pas de re-branchement sur l'étiquette définie par Onerrgo en cas de nouvelle erreur (pour éviter les boucles infinies dans ce cas...).

On peut définir l'étiquette appelée par Onerrgo, dans un autre traitement. Il faut alors en préciser le nom dans l'instruction. Ce mécanisme permet de se constituer des traitements généraux de gestion d'erreur.

Onerrgo sans étiquette supprime la référence à une étiquette en cas d'erreur; par la suite, toute erreur provoque une interruption du traitement, et l'affichage d'un message d'erreur.

Un traitement de gestion d'erreur se termine soit par Resume, soit par End. Dans le premier cas, l'exécution du traitement interrompu par l'erreur reprendra à l'instruction suivant celle où s'est produit l'erreur. Dans le deuxième cas, le traitement est interrompu de façon définitive.

 

Remarques

Le traitement de gestion d'erreur ne peut, en aucun cas, terminer une transaction, que ce soit par Commit ou par Rollback, car il ne peut pas être du même niveau de localité que le traitement qui la initiée.

S'il y a une transaction en cours quand l'erreur est détectée, elle est annulée automatiquement (Rollback) si le traitement se termine par End. L'utilisateur en sera averti.

Les codes d'erreurs renvoyés errn sont des entiers positifs supérieurs ou égaux à 5; dans le manuel de référence, ces erreurs sont toutes désignées par un symbole suivi de la valeur numérique de l'erreur (par exemple "PAFIC (20)" pour l'erreur fichier inexistant). Dans le manuel de programmation, un chapitre des annexes donne la liste des symboles et des valeurs numériques d'erreur. Par ailleurs, la fonction errmes$ permet de trouver le message d'erreur correspondant à un code d'erreur donné et la fonction errm permet de préciser celui-ci.

Une déclaration Onerrgo reste valide tant que l'on ne quitte pas le traitement (elle est simplement ignorée entre le moment où on débute le traitement d'erreur et le Resume, mais elle reprend aussitôt après).

Dès qu'une gestion d'erreurs est faite dans un traitement, elle agit aussi dans chaque sous-programme appelé par Call. Cependant, si un sous-programme ne comporte pas d'Onerrgo, et qu'une erreur se produit lors de son exécution, le sous-programme va s'arrêter, et le traitement appelant va traiter l'erreur. Si l'instruction Resume termine le traitement de gestion d'erreur, son exécution relancera les instructions du traitement appelant, celles du sous-programme placées après celle ayant produit l'erreur étant alors ignorées (dans le cas d'un End, l'arrêt du traitement appelant est définitif). Il est donc impératif d'utiliser Onerrgo dans un sous-programme appelé par Call pour y gérer les erreurs spécifiques.

 

Erreurs associées

Erreur

Description

PAFIC (20)

Traitement inexistant.

ERLAB (39)

Etiquette inexistante (dans la syntaxe "Onerrgo étiquette", une étiquette inexistante est détectée dès la validation du traitement).

ERMODE (10)

exp_nomtrt n'est pas une expression alphanumérique.

 

Mots-clés associés

END - RESUME - ERRN - ERRL - ERRP  - ERRMES$ - ERRM - CALL - ERRBOX - ENDBOX