Maîtriser la gestion d'erreurs en C : Bonnes pratiques et techniques
Le langage C ne fournit pas de support direct pour la gestion d'erreurs, mais en tant que langage de programmation système, il offre un accès de bas niveau via les valeurs de retour. La plupart des fonctions C ou Unix renvoient -1 ou NULL en cas d'erreur et définissent un code d'erreur errno. Cette variable globale indique qu'une erreur s'est produite lors d'un appel de fonction. Vous trouverez divers codes d'erreur définis dans le fichier d'en-tête <error.h>.
Un programmeur C peut vérifier les valeurs retournées et prendre les mesures appropriées selon la valeur de retour. Il est de bonne pratique d'initialiser errno à 0 au démarrage du programme. Une valeur de 0 indique qu'aucune erreur n'est survenue.
errno, perror() et strerror()
Le langage C fournit les fonctions perror() et strerror() pour afficher le message textuel associé à errno.
La fonction perror() affiche la chaîne que vous lui passez, suivie de deux-points, d'un espace, puis de la représentation textuelle de la valeur courante de
errno.La fonction strerror() renvoie un pointeur vers la représentation textuelle de la valeur courante de
errno.
Essayons de simuler une condition d'erreur en tentant d'ouvrir un fichier inexistant. J'utilise les deux fonctions pour montrer leur utilisation, mais vous pouvez utiliser l'une ou l'autre. Point important : vous devriez utiliser le flux stderr pour afficher toutes les erreurs.
Démonstration en direct#include <stdio.h>
#include <errno.h>
#include <string.h>
extern int errno;
int main() {
FILE *pf;
int errnum;
pf = fopen("inexistant.txt", "rb");
if (pf == NULL) {
errnum = errno;
fprintf(stderr, "Valeur de errno : %d\n", errno);
perror("Erreur affichée par perror");
fprintf(stderr, "Erreur d'ouverture du fichier : %s\n", strerror(errnum));
} else {
fclose(pf);
}
return 0;
}
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant :
Valeur de errno : 2 Erreur affichée par perror : No such file or directory Erreur d'ouverture du fichier : No such file or directory
Erreurs de division par zéro
C'est un problème courant : lors d'une division, les programmeurs ne vérifient pas si le diviseur est zéro, ce qui crée une erreur à l'exécution.
Le code ci-dessous corrige cela en vérifiant si le diviseur est zéro avant de diviser :
Démonstration en direct#include <stdio.h>
#include <stdlib.h>
main() {
int dividende = 20;
int diviseur = 0;
int quotient;
if (diviseur == 0) {
fprintf(stderr, "Division par zéro ! Arrêt...\n");
exit(-1);
}
quotient = dividende / diviseur;
fprintf(stderr, "Valeur du quotient : %d\n", quotient);
exit(0);
}
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant :
Division par zéro ! Arrêt...
Statut de sortie du programme
Il est d'usage de quitter avec la valeur EXIT_SUCCESS en cas de fin réussie. EXIT_SUCCESS est une macro définie à 0.
Si une condition d'erreur survient et que vous quittez le programme, vous devriez sortir avec le statut EXIT_FAILURE qui est défini à -1. Réécrivons le programme précédent :
#include <stdio.h>
#include <stdlib.h>
main() {
int dividende = 20;
int diviseur = 5;
int quotient;
if (diviseur == 0) {
fprintf(stderr, "Division par zéro ! Arrêt...\n");
exit(EXIT_FAILURE);
}
quotient = dividende / diviseur;
fprintf(stderr, "Valeur du quotient : %d\n", quotient);
exit(EXIT_SUCCESS);
}
Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant :
Valeur du quotient : 4
Langue C
- Gestion des fichiers en C : Maîtriser les E/S avec fopen, fprintf, fread et fseek
- Maîtriser la gestion d'exceptions Java : try, catch, finally, throw et throws expliqués
- Maîtriser les taux d'erreur de code ADC : Ce qu'il faut savoir
- Meilleures pratiques pour le stockage et la manipulation des courroies de transmission
- Maîtriser la gestion des signaux en C++ : Interruption sécurisée et terminaison propre du programme
- Maîtriser la gestion d'exceptions en C# : stratégies et bonnes pratiques
- Maîtriser la gestion d'exceptions en Python : Guide complet
- Maîtriser la sécurité de la manutention : meilleures pratiques pour des opérations efficaces et sans risque
- Comprendre la manutention : Concepts clés & Meilleures pratiques