Discussion:Programmation C/Erreurs
Hmmm, il y a quelques points où je suis en désaccord. Tout d'abord appeler 'errno.h' une bibliothèque, c'est un peu de l'abus compte tenu de la précarité du module. Ensuite il ne faut pas ajouter de variable globale : la déclaration externe est incluse dans le fichier entête. Si elle ne l'est pas, c'est un bug. Quant à détecter quand la valeur de errno est pertinente, c'est bien là le problème : il n'y a rien de standard. Une méthode plus "sure" consiste à sauvegarder la valeur lorsqu'une fonction retourne un code d'erreur ET que cette fonction utilise errno (évidemment, mais toutes ne passent pas par cette variable, loin s'en faut).
En fait la gestion des erreurs est spécifique à chaque fonction et devrait être décrite au moment de présenter cette fonction. Décrire un mécanisme générique, en C, me parait être au mieux une gageure, au pire très incomplet. Thierry Pierron 26 déc 2004 à 23:53 (UTC)
- J'ai modifié la page pour prendre en compte plusieurs de ces commentaires avisés ;)
- J'ai ajouté un exemple d'utilisation à base de strtoul, mais je n'en suis pas très satisfait... Cette fonction a un contrôle d'erreur assez complexe, un exemple plus simple serait le bienvenu.
- Par ailleurs, j'ai séparé la liste des codes d'erreur en 2, seuls 3 codes étant définis par la norme C, le reste me semblant être du POSIX (? Je n'ai pas vérifié). Il reste encore à détailler les codes d'erreur (ou au moins les expliciter, même si on ne les détaille pas vraiment), et peut-être à enlever les codes POSIX (?), ou au moins une grande partie. On peut garder quelques codes pour exemple, mais la liste complète me semble hors-sujet.
- Je ne suis pas non plus totalement satisfait de ma formulation pour expliquer qu'il est nécessaire de mettre errno à 0 avant de faire un appel de fonction qu'on veut contrôler. Si quelqu'un trouve mieux...
- Pour le problème plus général de la gestion d'erreur, hors errno.h, il est vrai qu'il faudrait faire un paragraphe (ou même un chapitre) plus détaillé dessus. Alveric 14 juin 2006 à 15:24 (CEST)
- Bon, en fait la gestion des erreurs en C peut se torcher très facilement avec la fonction strerror(). De toute façon enumérer tous les codes d'erreurs possible de errno.h, c'est débile. Se taper un switch avec 472 valeurs, c'est imbitable, plus personne ne fera ça de nos jours pour une fonctionnalité aussi élémentaire. Thierry Pierron 21 juin 2006 à 04:42 (CEST)
- Je suis d'accord avec tes modifs. J'avais en effet pensé à
strerror()
ouperror()
pour mon code d'exemple, mais je voulais faire un truc plus simple... Au final, je me rends compte que les réutiliser directement est plus efficace. Et pour les 3 codes d'erreur définis par la norme, autant les détailler dans chaque fonction qui y fait appel... - Je remarque juste que mon code est faux: si on essaye de convertir exactement la valeur
ULONG_MAX
, on renvoie une erreur alors que c'est ok... Je corrige ;) Alveric 21 juin 2006 à 14:03 (CEST)
- Je suis d'accord avec tes modifs. J'avais en effet pensé à
- Bon, en fait la gestion des erreurs en C peut se torcher très facilement avec la fonction strerror(). De toute façon enumérer tous les codes d'erreurs possible de errno.h, c'est débile. Se taper un switch avec 472 valeurs, c'est imbitable, plus personne ne fera ça de nos jours pour une fonctionnalité aussi élémentaire. Thierry Pierron 21 juin 2006 à 04:42 (CEST)