Différences entre les versions de « Programmation C/Erreurs »

→‎Utilisation : ajout d'un paragraphe + style + corrections mineures
(+ noinclude sur les notes de bas de page)
(→‎Utilisation : ajout d'un paragraphe + style + corrections mineures)
On peut alors utiliser la variable <code>errno</code>, de type <code>int</code>, pour traiter les erreurs<ref name="typeErrno"><code>errno</code> peut être définie par une macro ou un identificateur. N'essayez donc pas de récupérer son adresse.</ref>.
 
Lorsqu'on veut utiliser <code>errno</code> pour déterminer la cause d'un échec, il faut d'abord s'assurer que la fonction a bel et bien échoué. Le C laissant une certaine liberté dans la manière de signaler un échec, il n'y a pratiquement aucun mécanisme universel qui permette de détecter une telle situation, chaque fonction étant presque un cas particulier. Cepandant, une pratique relativement répandue est de retourner un code spécifique, en général en dehors de l'intervalle de ce qu'on attend. Par exemple, lorsque la fonction est censée allouer un objet et retourne un pointeur, une erreur est souvent signalée en retournant leun pointeur générique <code>NULL</code>nul, et la variable <code>errno</code> décrit plus en détail la nature de l'erreur.
 
== Affichage d'un message d'erreur ==
Une fois qu'on est sûr que la variable <code>errno</code> contient une valeur pertinente, il est indispensable de présenter un message tout aussi significatif à l'utilisateur. Rien n'est plus frustrant qu'un message aussi abscons que : "<code>fopen("/tmp/tmpab560f9d4", "w") : erreur 28</code>", alors qu'écrit sous la forme&nbsp;: "<code>impossible de créer le fichier /tmp/tmpab560f9d4: plus de place disponible sur le périphérique</code>", c'est tout de suite nettement plus pertinent.
 
Une fois qu'on est sûr que la variable <code>errno</code> contient une valeur pertinente, il est indispensable de déterminer le traitement à effectuer, et le cas échéant présenter un message tout aussi significatif à l'utilisateur. Rien n'est plus frustrant pour un utilisateur qu'un message aussi abscons que : "<code>fopen("/tmp/tmpab560f9d4", "w") : erreur 28</code>", alors qu'un message écrit sous la forme&nbsp;: "<code>impossible de créer le fichier /tmp/tmpab560f9d4: plus de place disponible sur le périphérique</code>", c'estsera toutplus defacilement suitecompris nettementpar plus pertinentl'utilisateur.
Énumérer toutes les valeurs possibles d'<code>errno</code> peut être relativement pénible, surtout si on doit le faire dans chaque application. Heureusement qu'une fonction toute prête existe&nbsp;:
 
Énumérer toutes les valeurs possibles d'<code>errno</code> pour leur associer un message peut être relativement pénible, surtout si on doit le faire dans chaque application. Heureusement qu'une fonction toute prête existe&nbsp;:
 
#include <string.h>
char * strerror(int code);
 
Cette fonction permet de connaître la signification textuelle d'une valeur de <code>errno</code>. À noter que le code de retour est une chaine statique, dont il est sage de présupposer la durée de vie la plus courte possible. N'essayez pas non plus de modifier le contenu de la chaîne, affichez -la directement ou copiez -la dans une zone temporaire.
 
Un autre intérêt de passer par cette fonction est que les messages retournés sont adaptés à la localisation du système. Ce qui est loin d'être négligeable, lorsqu'oncar voitcela laretire pléthoreau programmeur le souci de traduire les messages d'erreurs quedus peuventà générerla nebibliothèque serait-cestandard quedans toutes les fonctionslangues possibles (chaque implémentation pouvant avoir ses propres codes d'entrées/sortieserreur spécifiques, la maintenance d'une telle traduction serait un cauchemar).
 
== Exemple ==
Utilisateur anonyme