Page suivante Page précédente Table des matières

4. Erreurs

4.1 errno, perror()

La plupart des fonctions du système peuvent échouer pour diverses raisons. On peut alors examiner la variable errno pour déterminer plus précisément la cause de l'échec, et agir en conséquence.

#include <errno.h>
extern int errno;

La fonction perror() imprime sur la sortie d'erreur standard un message décrivant la dernière erreur qui s'est produite, précédé par la chaîne s.

#include <stdio.h>
void perror(const char *s);

Enfin, la fonction strerror() retourne le texte (en anglais) du message d'erreur correspondant à un numéro.

#include <string.h>
char *strerror(int errnum);

Exemple : programme qui change les droits d'accès à des fichiers grâce à la commande système chmod(2).


 
  1     /* droits.c */

  2     /* 
  3      * met les droits 0600 sur un ou plusieurs fichiers 
  4      * (illustration de chmod() et errno)
  5     */

  6     #include <stdlib.h>
  7     #include <stdio.h>
  8     #include <sys/stat.h>
  9     #include <errno.h>
 10     #include <string.h>

 11     int main(int argc, char *argv[])
 12     {
 13             int k;
 14             for (k = 1; k < argc; k++) {
 15                     printf("%s: ", argv[k]);
 16                     if (chmod(argv[k], S_IREAD | S_IWRITE) != 0)
 17                             switch (errno) {
 18                             case EACCES:
 19                                     printf
 20                                         ("impossible de consulter un des "
 21                                          "répertoires du chemin");
 22                                     break;
 23                             case ELOOP:
 24                                     printf
 25                                         ("trop de liens symboliques (boucles ?)");
 26                                     break;
 27                             case ENAMETOOLONG:
 28                                     printf("le nom est trop long");
 29                                     break;
 30                             case ENOENT:
 31                                     printf("le fichier n'existe pas");
 32                                     break;
 33                             case EPERM:
 34                                     printf("permission refusée");
 35                                     break;
 36                             default:
 37                                     printf("erreur %s", strerror(errno));
 38                                     break;
 39                             };
 40                     printf("\n");
 41             };
 42             exit(EXIT_SUCCESS);
 43     }
 

4.2 Traitement des erreurs, branchements non locaux

#include <setjmp.h>

int setjmp(jmp_buf env);
void longjmp(jmp_buf env, int val);

Ces deux fonctions permettent de réaliser un branchement d'une fonction à une autre (la première doit avoir été appelée, au moins indirectement, par la seconde). C'est un moyen primitif de réaliser un traitement d'erreurs par exceptions.

La fonction setjmp() sauve l'environnement (contexte d'exécution) dans la variable tampon env, et retourne 0 si elle a été appelée directement.

La fonction longjmp() rétablit le dernier environnement qui a été sauvé dans env par un appel à setjmp(). Le programme continue à l'endroit du setjmp() comme si celui-ci avait retourné la valeur val. (Si on met val à 0 la valeur retournée est 1).

Exemple.


 
  1     /* jump.c */

  2     #include <setjmp.h>
  3     #include <stdio.h>
  4     #include <stdlib.h>

  5     #define EQUATION_SANS_SOLUTION 1
  6     #define EQUATION_TRIVIALE 2

  7     jmp_buf erreur;

  8     float resolution(int a, int b)
  9     {
 10             if (a == 0) {
 11                     if (b == 0)
 12                             longjmp(erreur, EQUATION_TRIVIALE);
 13                     else
 14                             longjmp(erreur, EQUATION_SANS_SOLUTION);
 15             };
 16             return (-b / (float) a);
 17     }

 18     int main(void)
 19     {
 20             int a, b;
 21             float x;
 22             int ret;

 23             printf("Coefficients de ax+b=0\n");
 24             scanf("%d %d", &a, &b);

 25             ret = setjmp(erreur);
 26             if (ret == 0) {
 27                     x = resolution(a, b);
 28                     printf("Solution = %f\n", x);
 29                     exit(EXIT_SUCCESS);
 30             };

 31             switch (ret) {
 32             case EQUATION_SANS_SOLUTION:
 33                     printf("Cette équation n'a pas de solution\n");
 34                     break;
 35             case EQUATION_TRIVIALE:
 36                     printf("Cette équation est toujours vraie.\n");
 37                     break;
 38             };
 39             exit(EXIT_FAILURE);
 40     }
 


Page suivante Page précédente Table des matières