Gestion des erreurs
Introduction à la gestion des erreurs dans la validation des entrées
La gestion des erreurs est un aspect crucial de la validation des entrées qui garantit une exécution robuste et sécurisée du programme. Une gestion appropriée des erreurs permet d'éviter les comportements inattendus et de fournir des informations significatives aux utilisateurs.
Stratégies de gestion des erreurs
1. Approche par valeur de retour
enum ValidationResult {
VALID_INPUT = 0,
ERROR_EMPTY_INPUT = -1,
ERROR_INVALID_FORMAT = -2,
ERROR_OUT_OF_RANGE = -3
};
int validate_input(const char *input, int min, int max) {
if (input == NULL || strlen(input) == 0) {
return ERROR_EMPTY_INPUT;
}
char *endptr;
long value = strtol(input, &endptr, 10);
if (*endptr != '\0') {
return ERROR_INVALID_FORMAT;
}
if (value < min || value > max) {
return ERROR_OUT_OF_RANGE;
}
return VALID_INPUT;
}
2. Mécanisme de journalisation des erreurs
#include <stdio.h>
#include <time.h>
void log_validation_error(const char *input, int error_code) {
FILE *log_file = fopen("validation_errors.log", "a");
if (log_file == NULL) {
perror("Error opening log file");
return;
}
time_t current_time;
time(¤t_time);
fprintf(log_file, "[%s] Input: %s, Error Code: %d\n",
ctime(¤t_time), input, error_code);
fclose(log_file);
}
Modèles de gestion des erreurs
Modèle |
Description |
Cas d'utilisation |
Codes de retour |
Indicateurs d'erreur numériques |
Communication d'erreur simple |
Journalisation des erreurs |
Suivi persistant des erreurs |
Débogage et surveillance |
Gestion des exceptions |
Interruption du flux normal |
Scénarios d'erreur complexes |
Mécanisme de rappel (callback) |
Traitement personnalisé des erreurs |
Gestion flexible des erreurs |
Diagramme de flux des erreurs
graph TD
A[Input Received] --> B{Validate Input}
B -->|Valid| C[Process Input]
B -->|Invalid| D[Error Detection]
D --> E{Error Type}
E -->|Logging| F[Write to Log]
E -->|User Feedback| G[Display Error Message]
E -->|Critical| H[Terminate Program]
Techniques avancées de gestion des erreurs
Gestionnaire d'erreurs personnalisé
typedef struct {
int error_code;
const char *error_message;
void (*error_handler)(const char *input);
} ErrorHandler;
void handle_input_error(const char *input) {
ErrorHandler handlers[] = {
{ERROR_EMPTY_INPUT, "Empty input not allowed", default_error_handler},
{ERROR_INVALID_FORMAT, "Invalid input format", format_error_handler},
{ERROR_OUT_OF_RANGE, "Input out of acceptable range", range_error_handler}
};
for (size_t i = 0; i < sizeof(handlers) / sizeof(handlers[0]); i++) {
if (handlers[i].error_code == current_error) {
log_validation_error(input, handlers[i].error_code);
handlers[i].error_handler(input);
break;
}
}
}
Exemple complet de gestion des erreurs
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_INPUT_LENGTH 50
int main() {
char input[MAX_INPUT_LENGTH];
int result;
while (1) {
printf("Enter a number (1-100, or 'q' to quit): ");
fgets(input, sizeof(input), stdin);
input[strcspn(input, "\n")] = 0;
if (strcmp(input, "q") == 0) {
break;
}
result = validate_input(input, 1, 100);
switch (result) {
case VALID_INPUT:
printf("Valid input: %ld\n", strtol(input, NULL, 10));
break;
case ERROR_EMPTY_INPUT:
log_validation_error(input, result);
printf("Error: Empty input\n");
break;
case ERROR_INVALID_FORMAT:
log_validation_error(input, result);
printf("Error: Invalid number format\n");
break;
case ERROR_OUT_OF_RANGE:
log_validation_error(input, result);
printf("Error: Number out of range\n");
break;
}
}
return 0;
}
Bonnes pratiques
- Validez toujours et gérez les erreurs potentielles
- Fournissez des messages d'erreur clairs
- Journalisez les erreurs pour le débogage
- Mettez en œuvre une récupération gracieuse des erreurs
- Utilisez des codes d'erreur significatifs
LabEx recommande de mettre en œuvre une gestion complète des erreurs pour créer des programmes C robustes et conviviaux.