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

Contenu supprimé Contenu ajouté
→‎Utilisation : ajout d'un paragraphe + style + corrections mineures
Précisions sur l'utiisation d'errno
Ligne 10 :
 
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 un pointeur nul, et la variable <code>errno</code> décrit plus en détail la nature de l'erreur.
 
Il est nécessaire de placer <code>errno</code> à 0 ''avant'' d'utiliser la fonction qui peut échouer, car les fonctions de la bibliothèque standard ne sont pas obligées de la mettre à zéro en cas de succès. Si on ne la réinitialisait pas « manuellement », on pourrait « voir » le résultat d'une erreur causée par un appel de fonction antérieur. La procédure à suivre est donc la suivante :
* Mettre <code>errno</code> à 0 ;
* Appeler la fonction (de la bibliothèque standard) que l'on souhaite ;
* Vérifier si elle a échoué ;
** Si c'est le cas : la valeur de <code>errno</code> est disponible pour traiter l'erreur ;
** Sinon : procéder à la suite du traitement.
 
== Affichage d'un message d'erreur ==
Ligne 62 ⟶ 69 :
Impossible de convertir le nombre '18446744073709551615': la valeur est en dehors de l'intervalle du type spécifié.
 
IlNotons bien qu'il est nécessaire de placer <code>errno</code> à 0 ''avant'' d'utiliser <code>strtoul</code>, car les fonctions de la bibliothèque standard ne sont pas obligées de la mettre à zéro en cas de succès. Si on ne la réinitialisait pas «&nbsp;manuellement&nbsp;», onelle pourrait voircontenir le résultat d'une erreurvaleur causéenon parnulle, unmême appelau de fonction antérieur. C'est une des lourdeurslancement du modèle de gestion d'erreur du C, bien qu'une telle paranoïa n'est pas toujours nécessaireprogramme.
 
<noinclude>
== Notes ==