Fehlerbehandlung
Einführung in die Fehlerbehandlung bei der Eingabevalidierung
Die Fehlerbehandlung ist ein entscheidender Aspekt der Eingabevalidierung, der eine robuste und sichere Programmausführung gewährleistet. Eine ordnungsgemäße Fehlerverwaltung hilft, unerwartetes Verhalten zu vermeiden und den Benutzern sinnvolle Rückmeldungen zu geben.
Fehlerbehandlungsstrategien
1. Rückgabewert-Ansatz
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. Fehlerprotokollierungsmechanismus
#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);
}
Fehlerbehandlungsmuster
Muster |
Beschreibung |
Anwendungsfall |
Rückgabecodes |
Numerische Fehlerindikatoren |
Einfache Fehlerkommunikation |
Fehlerprotokollierung |
Dauerhafte Fehlerverfolgung |
Debugging und Überwachung |
Ausnahmebehandlung |
Unterbrechung des normalen Ablaufs |
Komplexe Fehlerszenarien |
Callback-Mechanismus |
Benutzerdefinierte Fehlerverarbeitung |
Flexible Fehlerverwaltung |
Fehlerablaufdiagramm
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]
Fortgeschrittene Fehlerbehandlungstechniken
Benutzerdefinierter Fehlerbehandler
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;
}
}
}
Vollständiges Beispiel für die Fehlerbehandlung
#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;
}
Best Practices
- Validieren und behandeln Sie immer potenzielle Fehler.
- Geben Sie klare Fehlermeldungen an.
- Protokollieren Sie Fehler für das Debugging.
- Implementieren Sie eine fehlerfreie Fehlerbehebung.
- Verwenden Sie sinnvolle Fehlercodes.
LabEx empfiehlt die Implementierung einer umfassenden Fehlerbehandlung, um robuste und benutzerfreundliche C-Programme zu erstellen.