45.3. Guide de style des messages d'erreurs
Ce guide de style est fournit dans l'espoir de maintenir une
cohérence et un style facile à comprendre dans tous les messages
générés par PostgreSQL™.
Le message primaire devrait être court, factuel et éviter les
références aux détails d'exécution comme le nom de fonction
spécifique. « Court » veut
dire « devrait tenir sur une ligne dans
des conditions normales ». Utilisez un message détail
si nécessaire pour garder le message primaire court ou si vous
sentez le besoin de mentionner les détails de l'implémentation
comme un appel système particulier qui échoue. Les messages
primaires et détails doivent être factuels. Utilisez un message
conseil pour les suggestions à propos de quoi faire pour fixer le
problème, spécialement si la suggestion ne pourrait pas toujours
être applicable.
Par exemple, au lieu de
IpcMemoryCreate: shmget(clé=%d, taille=%u, 0%o) a échoué : %m
(plus un long supplément qui est basiquement un conseil)
écrivez
Primaire: Ne peut pas créer un ségment en mémoire partagée : %m
Détail: L'appel système qui a échoué était shmget(key=%d, size=%u, 0%o).
Astuce: Le supplément
Raisonnement : garder le message primaire court aide à le garder au
point et laisse les clients présenter un espace à l'écran sur la
supposition qu'une ligne est suffisante pour les messages
d'erreurs. Les messages détails et conseils peuvent être relégués à
un mode verbeux ou peut-être dans une fenêtre pop-up détaillant
l'erreur. De plus, les détails et les conseils devront normalement
être supprimés des traces du serveur pour gagner de l'espace. La
référence aux détails d'implémentation est à éviter puisque les
utilisateurs n'en connaissent de toute façon pas les détails.
N'émettez pas d'hypothèses spécifiques à propos du formatage dans
les messages textes. Attendez-vous à ce que les clients et les
traces du serveur enveloppent les lignes pour correspondre à leurs
propres besoins. Dans les messages longs, les caractères
d'interlignes (\n) peuvent être utilisés pour indiquer les coupures
suggérées d'un paragraphe. Ne terminez pas un message avec un
caractère d'interlignes. N'utilisez pas des tabulations ou d'autres
caractères de formatage (dans les affichages des contextes
d'erreurs, les caractères d'interlignes sont automatiquement
ajoutés pour séparer les niveaux d'un contexte comme dans les
appels aux fonctions).
Raisonnement : les messages ne sont pas nécessairement affichés
dans un affichage de type terminal. Dans les interfaces graphiques
ou les navigateurs, ces instructions de formatage sont, au mieux,
ignorées.
Les textes en anglais devraient utiliser des guillemets doubles
quand la mise entre guillemets est appropriée. Les textes dans les
autres langues devraient uniformément employer un genre de
guillemets qui est conforme aux coutumes de publication et à la
sortie visuelle des autres programmes.
Raisonnement : le choix des guillemets doubles sur celui des
guillemets simples est quelque peu arbitraire mais tend à être
l'utilisation préférée. Certains ont suggéré de choisir le type de
guillemets en fonction du type d'objets des conventions SQL
(notamment, les chaînes de caractères entre guillemets simples, les
identifiants entre guillemets doubles). Mais ceci est un point
technique à l'intérieur du langage avec lequel beaucoup
d'utilisateurs ne sont pas familiers ; les conventions SQL ne
prennent pas en compte les autres genres de termes entre
guillemets, ne sont pas traduites dans d'autres langues et manquent
un peu de sens aussi.
Utilisation des
guillemets
Utilisez toujours les guillemets pour délimiter les noms de
fichiers, les identifiants fournis par les utilisateurs et les
autres variables qui peuvent contenir des mots. Ne les utilisez pas
pour marquer des variables qui ne contiennent pas de mots (par
exemple, les noms d'opérateurs).
Il y a des fonctions au niveau du serveur qui vont, au besoin,
mettre entre guillemets leur propre flux de sortie (par exemple,
format_type_be()). Ne mettez pas de
guillemets supplémentaires autour du flux de sortie de ce genre de
fonctions.
Raisonnement : les objets peuvent avoir un nom qui crée une
ambiguïté une fois incorporé dans un message. Soyez prudent en
indiquant où un nom commence et fini. Mais n'encombrez pas les
messages avec des guillemets qui ne sont pas nécessaires ou qui
sont dupliqués.
Les règles sont différentes pour les messages d'erreurs primaires
et pour les messages détails/conseils :
Messages d'erreurs primaires : ne mettez pas en majuscule la
première lettre. Ne terminez pas un message avec un point. Ne
pensez même pas à finir un message avec un point d'exclamation.
Messages détails et conseils : utilisez des phrases complètes et
toutes terminées par des points. Mettez en majuscule le premier mot
des phrases.
Raisonnement : éviter la ponctuation rend plus facile, pour les
applications clientes, l'intégration du message dans des contextes
grammaticaux variés. Souvent, les messages primaires ne sont de
toute façon pas des phrases complètes (et s'ils sont assez longs
pour être sur plusieurs phrases, ils devraient être divisés en une
partie primaire et une partie détail). Cependant, les messages
détails et conseils sont longs et peuvent avoir besoin d'inclure de
nombreuses phrases. Pour la cohérence, ils devraient suivre le
style des phrases complètes même s'il y a seulement une phrase.
Majuscule contre
minuscule
Utilisez les minuscules pour les mots d'un message, inclus la
première lettre d'un message d'erreur primaire. Utilisez les
majuscules pour les commandes et les mots-clé SQL s'ils
apparaissent dans le message.
Raisonnement : il est plus facile de rendre toutes les choses plus
cohérentes au regard de cette façon, puisque certains messages sont
des phrases complètes et d'autres non.
Utilisez la voix active. Utilisez des phrases complètes quand il y
a un sujet (« A ne peut pas faire
B »). Utilisez le style télégramme, sans sujet, si le
sujet est le programme lui-même ; n'utilisez pas
« Je » pour le programme.
Raisonnement : le programme n'est pas humain. Ne prétendez pas
autre chose.
Utilisez le passé si une tentative de faire quelque chose échouait,
mais pourrait peut-être réussir la prochaine fois (peut-être après
avoir corriger certains problèmes). Utilisez le présent si l'échec
est sans doute permanent.
Il y a une différence sémantique non triviale entre les phrases de
la forme
n'a pas pu ouvrir le fichier "%s": %m
et
ne peut pas ouvrir le dossier "%s"
La première forme signifie que la tentative d'ouverture du fichier
a échoué. Le message devrait donner une raison comme
« disque plein » ou
« le fichier n'existe pas ».
Le passé est approprié parce que la prochaine fois le disque peut
ne plus être plein ou le fichier en question peut exister.
La seconde forme indique que la fonctionnalité d'ouvrir le fichier
nommé n'existe pas du tout dans le programme ou que c'est
conceptuellement impossible. Le présent est approprié car la
condition persistera indéfiniment.
Raisonnement : d'accord, l'utilisateur moyen ne sera pas capable de
tirer de grandes conclusions simplement à partir du temps du
message mais, puisque la langue nous fournit une grammaire, nous
devons l'utiliser correctement.
En citant le nom d'un objet, spécifiez quel genre d'objet c'est.
Raisonnement : sinon personne ne saura ce qu'est
« foo.bar.baz ».
Les crochets sont uniquement utilisés (1) dans les synopsis des
commandes pour indiquer des arguments optionnels ou (2) pour
indiquer l'indice inférieur d'un tableau.
Raisonnement : rien de ce qui ne correspond pas à l'utilisation
habituelle, largement connue troublera les gens.
Assembler les messages
d'erreurs
Quand un message inclut du texte qui est généré ailleurs,
intégrez-le dans ce style :
n'a pas pu ouvrir le fichier %s: %m
Raisonnement : il serait difficile d'expliquer tous les codes
d'erreurs possibles pour coller ceci dans une unique phrase douce,
ainsi une certaine forme de ponctuation est nécessaire. Mettre le
texte inclus entre parenthèses a été également suggéré, mais ce
n'est pas naturel si le texte inclus est susceptible d'être la
partie la plus importante du message, comme c'est souvent le cas.
Les messages devraient toujours indiquer la raison pour laquelle
une erreur s'est produite. Par exemple :
MAUVAIS : n'a pas pu ouvrir le fichier %s
MEILLEUR : n'a pas pu ouvrir le fichier %s (échec E/S)
Si aucune raison n'est connue, vous feriez mieux de corriger le
code.
N'incluez pas le nom de la routine de rapport dans le texte de
l'erreur. Nous avons d'autres mécanismes pour trouver cela quand
c'est nécessaire et, pour la plupart des utilisateurs, ce n'est pas
une information utile. Si le texte de l'erreur n'a plus beaucoup de
sens sans le nom de la fonction, reformulez-le.
MAUVAIS : pg_atoi: erreur dans "z": ne peut pas analyser "z"
MEILLEUR : syntaxe en entrée invalide pour l'entier : "z"
Évitez de mentionner le nom des fonctions appelées, au lieu de cela
dites ce que le code essayait de faire :
MAUVAIS : ouvrir() a échoué : %m
MEILLEUR : n'a pas pu ouvrir le fichier %s: %m
Si cela semble vraiment nécessaire, mentionnez l'appel système dans
le message détail (dans certains cas, fournir les valeurs réelles
passées à l'appel système pourrait être une information appropriée
pour le message détail).
Raisonnement : les utilisateurs ne savent pas tout ce que ces
fonctions font.
Incapable. « Incapable » est presque la voix passive. Une
meilleure utilisation est « ne pouvait
pas » ou « ne pourrait
pas » selon les cas.
Mauvais. Les messages d'erreurs comme
« mauvais résultat » sont
vraiment difficile à interpréter intelligemment. Cela est mieux
d'écrire pourquoi le résultat est « mauvais », par exemple, « format invalide ».
Illégal. « Illégal » représente une violation de la loi,
le reste est « invalide ».
Meilleur encore, dites pourquoi cela est invalide.
Inconnu. Essayez d'éviter « inconnu ». Considérez « erreur : réponse inconnue ». Si vous ne savez
pas qu'elle est la réponse, comment savez-vous que cela est
incorrect ? « Non reconnu »
est souvent un meilleur choix. En outre, assurez-vous d'inclure la
valeur pour laquelle il y a un problème.
MAUVAIS : type de noeud inconnu
MEILLEUR : type de noeud non reconnu : 42
Trouver contre Exister. Si le programme emploie un
algorithme non trivial pour localiser une ressource (par exemple,
une recherche de chemin) et que l'algorithme échoue, il est juste
de dire que le programme n'a pas pû « trouver » la ressource. D'un autre côté, si
l'endroit prévu pour la ressource est connu mais que le programme
ne peut pas accéder à celle-ci, alors dites que la ressource
n'« existe » pas. Utilisez
« trouvez » dans ce cas là
semble faible et embrouille le problème.
Orthographiez les mots en entier. Par exemple, évitez :
-
spec (NdT : spécification)
-
stats (NdT : statistiques)
-
params (NdT : paramètres)
-
auth (NdT : authentification)
-
xact (NdT : transaction)
Raisonnement : cela améliore la cohérence.