Gestion des erreurs dans les programmes C

Le langage C ne dispose pas d'un mécanisme intégré pour la gestion des erreurs, mais en tant que langage de bas niveau, il permet de signaler les erreurs via des valeurs de retour spécifiques. Lorsqu'une fonction échoue, elle retourne généralement -1 ou NULL, et une variable globale nommée errno est mise à jour pour refléter le code d'erreur. Ces codes sont définis dans le fichier d'en-tête errno.h.

Pour une gestion robuste, il est cnoseillé d'initialiser errno à 0 au démarrage du programme, car cette valeur indique l'absence d'erreur. En inspectant les valeurs de retour, les développeurs peuvent déterminer les actions correctives appropriées.

Utilisation de errno, perror() et strerror()

Ces fonctions fournissent des messages d'erreur lisibles :

  • perror() affiche une chaîne personnalisée suivie du message associé à l'erreur courante.
  • strerror() retourne une chaîne décrivant l'erreur correspondant à la valeur de errno.

L'exemlpe ci-dessous illuster une tentative d'ouverture d'un fichier inexistant, avec différents moyens de formater les messages d'erreur. Les sorties d'erreur doivent être dirigées vers le flux stderr.

#include <stdio.h>
#include <errno.h>
#include <string.h>

int main() {
    FILE *handle;
    int err_code;
    handle = fopen("data_manquante.bin", "rb");
    if (handle == NULL) {
        err_code = errno;
        fprintf(stderr, "Code erreur : %d\n", err_code);
        perror("Détail via perror");
        fprintf(stderr, "Échec d'accès : %s\n", strerror(err_code));
    } else {
        fclose(handle);
    }
    return 0;
}

La compilation et l'exécution de ce programme produisent la sortie suivante :

Code erreur : 2
Détail via perror: No such file or directory
Échec d'accès : No such file or directory

Prévention des divisions par zéro

Effectuer une division sans vérifier le diviseur entraîne une erreur d'exécution. Il est donc crucial d'ajouter une condition de contrôle avant l'opération.

#include <stdio.h>
#include <stdlib.h>

int main() {
    int numerateur = 20;
    int denominateur = 0;
    int resultat;

    if (denominateur == 0) {
        fprintf(stderr, "Diviseur nul détecté : arrêt du programme.\n");
        exit(EXIT_FAILURE);
    }
    resultat = numerateur / denominateur;
    fprintf(stderr, "Résultat du calcul : %d\n", resultat);

    exit(EXIT_SUCCESS);
}

L'exécution de ce code génère le message :

Diviseur nul détecté : arrêt du programme.

Codes de sortie du programme

Un programme peut terminer avec différents statuts : EXIT_SUCCESS (défini comme 0) pour une exécution réussie, et EXIT_FAILURE (souvent -1) pour signaler une erreur. Voici une version améliorée de l'exemple précédent utilisant ces macros.

#include <stdio.h>
#include <stdlib.h>

int main() {
    int dividende = 20;
    int diviseur = 5;
    int quotient;

    if (diviseur == 0) {
        fprintf(stderr, "Division impossible : diviseur nul.\n");
        exit(EXIT_FAILURE);
    }
    quotient = dividende / diviseur;
    fprintf(stderr, "Quotient calculé : %d\n", quotient);

    exit(EXIT_SUCCESS);
}

Ce code affiche :

Quotient calculé : 4

Étiquettes: C errno perror strerror Gestion des Erreurs

Publié le 31 mai à 20h02