> Tech > Traitement des erreurs

Traitement des erreurs

Tech - Par Renaud ROSSET - Publié le 24 juin 2010
email

Comme l'illustre la figure 1, l'API open() renverra -1 en cas d'anomalie. Le programme peut ainsi détecter une défaillance et agir en conséquence. Mais il ne dit rien sur la nature de la défaillance. Le fait de ne pas savoir quelle partie de l'API open() a échoué complique considérablement le

Traitement des erreurs

dépannage
des problèmes concernant l’API une
fois qu’elle a été mise en production !
En cas d’anomalie dans une API
IFS, celle-ci stockera un nombre correspondant
à  la nature de l’anomalie,
dans une variable spéciale appelée errono.
Vous pouvez diriger un pointeur
vers la variable errno en appelant la
fonction _errno() à  partir de la bibliothèque
runtime ILE C.
Par exemple, si l’API open() ne
peut pas créer un fichier parce que le
répertoire spécifié n’existe pas, l’API
open() stockera la valeur 3025 dans la
variable errno. Le programme ILE RPG
sera ensuite chargé d’extraire cette valeur
en lisant un entier dans la zone de
mémoire où se trouve la variable
errno. C’est ce qu’illustre la figure 9.
Vous savez maintenant que l’erreur
numéro 3025 s’est produite, mais sans
savoir forcément ce que ce nombre signifie. Les nombres stockés dans
errno correspondent en fait aux ID de
messages dans le fichier de messages
QCPFMSG. Ainsi, pour trouver la signification
de l’erreur numéro 3025,
vous pourriez taper la commande suivante
:

DSPMSGD CPE3025

La figure 10 montre comment extraire
errno et l’utiliser pour construire
un message escape qui est renvoyé
à  l’appelant du programme.
C’est une technique intéressante
quand on souhaite que le programme
échoue de manière théâtrale en cas
d’erreur. Un programme CL qui appelle
cet exemple de programme
pourrait détecter l’erreur avec la commande
MONMSG (Monitor Message)
et continuer normalement s’il le voulait.
Le texte « No such path or directory
» (Ce chemin ou répertoire
n’existe pas) sera journalisé dans le
job log.
Parfois, on préfèrera afficher le
message de défaillance sur l’écran plutôt
que de renvoyer un message
d’échec. C’est possible à  l’aide d’une
autre fonction provenant de la bibliothèque
runtime ILE C, appelée strerror().
Quand on appelle strerror(), on
doit transmettre un numéro d’erreur
comme paramètre. Il renverra un
pointeur vers une chaîne terminée
par null, contenant le texte du message
d’erreur. La BIF %str() de RPG
est conçue pour convertir des chaînes
terminées par des null en chaînes utilisables
en RPG. La figure 11 montre
l’extraction du texte du message à  partir
d’errno, à  l’aide de la fonction
strerror(), puis son affichage à  destination
de l’utilisateur avec le code
opération DSPLY.
Si vous examinez l’API open()
dans l’Information Center, vous
constaterez qu’elle énumère les conditions d’erreur susceptibles de se
produire quand l’API open() est utilisée.
Au lieu des numéros maintenant
familiers (comme 3025), elle présente
des noms comme EACCES et ENOENT,
qui sont des constantes nommées. ENOENT
est la constante nommée avec la
valeur 3025. Si vous examinez la
constante ENOENT dans la page
Information Center pour l’API open(),
vous verrez qu’elle indique « No such
file or directory » pour l’erreur qui s’est
produite puis explique davantage ce
qui peut causer une erreur ENOENT
dans l’API open().
J’ai défini les constantes nommées
utilisées comme numéros d’erreur
dans le membre ERRNO_H, qui est le
code source téléchargeable. Vous pouvez
utiliser la directive du compilateur
/copy pour les inclure dans vos programmes.

Téléchargez cette ressource

Guide inmac wstore pour l’équipement IT de l’entreprise

Guide inmac wstore pour l’équipement IT de l’entreprise

Découvrez toutes nos actualités à travers des interviews, avis, conseils d'experts, témoignages clients, ainsi que les dernières tendances et solutions IT autour de nos 4 univers produits : Poste de travail, Affichage et Collaboration, Impression et Infrastructure.

Tech - Par Renaud ROSSET - Publié le 24 juin 2010