Tratamento Robusto de Erros
Estratégias de Tratamento de Erros
Estrutura de Gerenciamento Abrangente de Erros
graph TD
A[Detecção de Erro] --> B{Tipo de Erro}
B --> |Recuperável| C[Recuperação Graciosa]
B --> |Crítico| D[Fechamento Controlado]
C --> E[Mecanismo de Repetição]
D --> F[Liberação de Recursos Limpa]
1. Técnicas de Registro de Erros
Registro Estruturado de Erros
enum LogLevel {
LOG_DEBUG,
LOG_INFO,
LOG_WARNING,
LOG_ERROR,
LOG_CRITICAL
};
void log_error(enum LogLevel level, const char *message) {
FILE *log_file = fopen("system_log.txt", "a");
if (log_file) {
fprintf(log_file, "[%s] %s\n",
level == LOG_ERROR ? "ERROR" : "CRITICAL",
message);
fclose(log_file);
}
}
2. Gerenciamento de Recursos
Gerenciamento de Recursos do Tipo RAII
typedef struct {
int fd;
char *buffer;
} ResourceContext;
ResourceContext* create_resource_context(int size) {
ResourceContext *ctx = malloc(sizeof(ResourceContext));
if (!ctx) {
return NULL;
}
ctx->buffer = malloc(size);
ctx->fd = open("example.txt", O_RDWR);
if (ctx->fd == -1 || !ctx->buffer) {
// Limpeza em caso de falha
if (ctx->fd != -1) close(ctx->fd);
free(ctx->buffer);
free(ctx);
return NULL;
}
return ctx;
}
void destroy_resource_context(ResourceContext *ctx) {
if (ctx) {
if (ctx->fd != -1) close(ctx->fd);
free(ctx->buffer);
free(ctx);
}
}
3. Padrões de Tratamento de Erros
Mecanismo de Repetição
#define MAX_TENTATIVAS 3
int operacao_rede_robusta() {
int tentativas = 0;
while (tentativas < MAX_TENTATIVAS) {
int resultado = chamada_rede();
if (resultado == 0) {
return SUCESSO;
}
if (eh_erro_transitório(resultado)) {
sleep(1 << tentativas); // Retraso exponencial
tentativas++;
} else {
return ERRO_FATAL;
}
}
return TENTATIVAS_ESGOTADAS;
}
4. Boas Práticas de Tratamento de Erros
| Prática |
Descrição |
| Falha Rápida |
Detectar e tratar erros imediatamente |
| Estado de Erro Mínimo |
Manter o código de tratamento de erros conciso |
| Registro Abrangente |
Registrar informações detalhadas sobre erros |
| Degradação Graciosa |
Fornecer caminhos alternativos em caso de falha |
5. Tratamento Avançado de Erros
Macro de Tratamento de Erros Personalizada
#define CHAMADA_SEGURA(chamada, manipulador_erro) \
do { \
if ((chamada) == -1) { \
perror("Operação falhou"); \
manipulador_erro; \
} \
} while(0)
// Exemplo de uso
CHAMADA_SEGURA(
open("config.txt", O_RDONLY),
{
log_error(LOG_ERROR, "Falha ao abrir o arquivo de configuração");
exit(EXIT_FAILURE);
}
)
6. Estratégias de Recuperação de Erros
Tratamento de Erros em Múltiplos Níveis
int processar_dados() {
int resultado = OPERACAO_PRIMARIA();
if (resultado != SUCESSO) {
// Tentar método alternativo
resultado = OPERACAO_SECUNDARIA();
if (resultado != SUCESSO) {
// Retorno final
resultado = OPERACAO_ALTERNATIVA();
}
}
return resultado;
}
Aprendendo com o LabEx
No LabEx, oferecemos cursos avançados de programação de sistemas que ensinam técnicas robustas de tratamento de erros por meio de exercícios práticos, ajudando os desenvolvedores a construir soluções de software resilientes.