« Programmation C/Erreurs » : différence entre les versions

Contenu supprimé Contenu ajouté
Tpierron (discussion | contributions)
Tpierron (discussion | contributions)
Aucun résumé des modifications
Ligne 8 :
On peut alors utiliser la variable '''errno''', de type '''int''', pour traiter les erreurs<ref name="typeErrno">'''errno''' peut être définie par une macro ou un identificateur. N'essayez pas de récupérer son adresse.</ref>.
 
Lorsqu'on veut utiliser '''errno''' pour déterminer la cause d'un échec, il faut d'abord s'assurer que la fonction a bel et bien échouée. Le C laissant une certaine liberté dans la manière de signaler un échec, il n'y a pratiquement aucun mécanisme universel qui permet 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 s'attend. Par exemple lorsque la fonction retourne un pointeur, pour allouer un objet, une erreur est souvent signalée en retournant le pointeur générique <code>NULL</code> et la variable <code>errno</code> décrit plus en détail la nature de l'erreur.
Lorsqu'on veut utiliser '''errno''' pour déterminer si un appel de fonction a bien fonctionné, ou pour préciser quelle est l'erreur si elle a échoué, il est nécessaire de mettre la variable à 0 avant de procéder à l'appel de la fonction. Ensuite, après l'appel de la fonction, on peut déterminer l'erreur (s'il y en a une) en comparant la valeur avec un certain nombre de macro définies dans '''errno.h'''.
 
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 abscon que : "<code>fopen("/tmp/tmpab560f9d4", "w") : erreur 28</code>".
 
É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;:
 
#include <string.h>
char * strerror(int code);
 
== Exemple ==