Manejo de errores
Introducción al manejo de errores en la validación de entrada
El manejo de errores es un aspecto crucial de la validación de entrada que garantiza una ejecución robusta y segura del programa. Un manejo adecuado de los errores ayuda a prevenir comportamientos inesperados y proporciona una retroalimentación significativa a los usuarios.
Estrategias de manejo de errores
1. Enfoque de valor de retorno
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. Mecanismo de registro de errores
#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);
}
Patrones de manejo de errores
Patrón |
Descripción |
Caso de uso |
Códigos de retorno |
Indicadores numéricos de error |
Comunicación de errores simples |
Registro de errores |
Seguimiento persistente de errores |
Depuración y monitoreo |
Manejo de excepciones |
Interrupción del flujo normal |
Escenarios de error complejos |
Mecanismo de devolución de llamada |
Procesamiento personalizado de errores |
Manejo flexible de errores |
Diagrama de flujo de errores
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]
Técnicas avanzadas de manejo de errores
Manejador de errores personalizado
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;
}
}
}
Ejemplo completo de manejo de errores
#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;
}
Mejores prácticas
- Siempre valide y maneje los posibles errores
- Proporcione mensajes de error claros
- Registre los errores para la depuración
- Implemente una recuperación de errores elegante
- Utilice códigos de error significativos
LabEx recomienda implementar un manejo de errores exhaustivo para crear programas en C robustos y amigables con el usuario.