Técnicas de Manejo de Errores
Flujo de Manejo de Errores
graph TD
A[Inicio del Programa] --> B{Condición de Error}
B --> |Error Detectada| C[Registrar Error]
C --> D[Limpiar Recursos]
D --> E[Salir con Código de Error]
B --> |Sin Error| F[Continuar Ejecución]
Estrategia de Códigos de Error
| Rango de Error |
Significado |
| 0-31 |
Reservado por el sistema |
| 32-127 |
Errores específicos de la aplicación |
| 128-255 |
Códigos de salida relacionados con señales |
Ejemplo Completo de Manejo de Errores
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#define FILE_ERROR 50
#define MEMORY_ERROR 51
void log_error(int error_code, const char* message) {
fprintf(stderr, "Error %d: %s\n", error_code, message);
}
int main() {
FILE *file = fopen("data.txt", "r");
if (file == NULL) {
log_error(FILE_ERROR, "No se puede abrir el archivo");
exit(FILE_ERROR);
}
char *buffer = malloc(1024);
if (buffer == NULL) {
log_error(MEMORY_ERROR, "Error en la asignación de memoria");
fclose(file);
exit(MEMORY_ERROR);
}
// Lógica de procesamiento del archivo
free(buffer);
fclose(file);
return EXIT_SUCCESS;
}
Técnicas Avanzadas de Manejo de Errores
Uso de errno para Errores Detallados
#include <errno.h>
#include <string.h>
#include <stdlib.h>
void handle_system_error() {
if (errno != 0) {
fprintf(stderr, "Error: %s\n", strerror(errno));
exit(EXIT_FAILURE);
}
}
Patrones de Manejo de Errores
- Salida Inmediata
- Registro y Continuación
- Degradación Gradual
- Mecanismo de Reintento
Estructura Personalizada de Manejo de Errores
typedef struct {
int code;
const char* message;
void (*handler)(void);
} ErrorHandler;
ErrorHandler error_map[] = {
{FILE_ERROR, "Error en la Operación de Archivo", cleanup_file_resources},
{MEMORY_ERROR, "Error en la Asignación de Memoria", release_resources}
};
Sugerencia de Desarrollo LabEx
En entornos LabEx, implementar un manejo robusto de errores es crucial para crear programas C confiables y mantenibles.
Buenas Prácticas
- Usar códigos de error consistentes
- Proporcionar mensajes de error significativos
- Limpiar siempre los recursos
- Registrar errores para depuración
- Manejar diferentes escenarios de error
Estrategias de Propagación de Errores
graph LR
A[Detección de Error] --> B{Tipo de Error}
B --> |Recuperable| C[Registrar y Continuar]
B --> |Crítico| D[Salir del Programa]
B --> |Fatal| E[Terminación Inmediata]
Enfoque Recomendado para el Manejo de Errores
- Detectar errores tempranamente
- Usar códigos de error descriptivos
- Implementar registro completo
- Asegurar la limpieza de recursos
- Proporcionar mensajes de error claros