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.
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...