Gérer les erreurs

 

Gestion simplifiée des erreurs

Certaines fonctions peuvent indiquer qu'une anomalie s'est produite. En général, la fonction retournera la valeur -1. Mais rien dans ce cas précise le type d'erreur.

Pour déterminer le type d'erreur qui a eu lieu, il faut utiliser une variable: errno qui va contenir un code de l'erreur.

 

Il faut inclure errno.h:

#include <errno.h>

Puis tester la valeur errno.

Image non trouvée !Plusieurs fonctions peuvent utiliser errno. Mais errno n'est pas remis à 0 par une fonction qui n'aura pas eu d'erreur durant son exécution. Donc testez bien la valeur en sortie de la fonction et non errno directement !

 

Gestion des erreurs plus poussée

#include <errno.h>
void perror(char *s);
extern int errno;
extern char *sys_errlist[];
extern int *sys_nerr;

La fonction perror envoie un message d'erreur sur la sortie d'erreur standard, correspondant à la dernière erreur rencontrée. La chaîne s est imprimée en premier suivie de: , d'un espace, du message lui-même et d'un passage à la ligne.

Le tableau sys_errlist contient la liste des messages d'erreurs, qui peut être indéxé par errno, sys_nerr contenant le nombre total de messages accessibles.

 

Tableau de quelques codes erreurs possibles:

Valeur Désignation
EACCES L'écriture dans le répertoire n'est pas autorisé pour l'UID effectif du processus, ou l'un des répertoires ne permet pas le parcours (exécution).
EXDEV Fonction link() : Le nom du lien et la cible ne résident pas sur le même système de fichiers.
EPERM Fonction link()Le système de fichiers contenant le lien et la cible ne permet pas la création de liens matériels.
ENAMETOOLONG Nom du fichier trop long
ENOENT Un répertoire indiqué dans le nom n'existe pas (ou lien pointant nulle part)
EISDIR Est un répertoire
ENOTDIR N'est pas un répertoire
ENOMEM Mémoire insuffisante pour effectuer l'opération
EROFS Le fichier se trouve sur un système de fichiers en lecture seule
EEXIST Existe déjà !
EMLINK Le nombre maximal de liens est atteind
ELOOP Référence circulaire (lien qui pointe sur lui même)
ENOSPC Nombre maximum de fichiers dans le répertoire atteind
EIO Une erreur d'entrée/sortie bas-niveau s'est produite.
EFAULT Le nom pointe en dehors de l'espace d'adressage accessible
ENODEV Le nom correspond à un fichier spécial et il n'y a pas de périphérique correspondant.
ETXTBSY Ecriture sur un exécutable en cours d'utilisation
EMFILE Le processus a déjà ouvert le nombre maximal de fichiers.
ENFILE

La limite du nombre total de fichiers ouverts sur le système est atteinte.

EINTR read() a été interrompu par un signal avant d'avoir eu le temps de lire quoi que ce soit.
EBADF Descripteur de fichier invalide
EFAULT Le buffer pointe en dehors de l'espace d'adressage accessible.
EINVAL
Le descripteur de fichier ne permet pas la lecture (fonction read() pour un fichier ouvert en écriture) ou l'écriture (fonction write () pour un fichier ouvert en lecture)
EFBIG Tentative d'écrire un fichier dont la taille dépasse un maximum dépendant de l'implémentation ou du processus, ou d'écrire à une position qui dépasse le déplacement maximal autorisé.
EPIPE fd est connecté à un tube (pipe) ou une socket dont l'autre extrémité est fermée. Quand ceci se produit, le processus écrivain reçoit un signal SIGPIPE . S'il intercepte, bloque ou ignore ce signal, EPIPE est renvoyé.
ENOSPC Plus de place pour enregistrer des données
EAGAIN Impossible de trouver un emplacement vide dans la table des processus.
...  

Ce tableau peut encore évoluer...