Tratamento de Erros
Compreendendo o Tratamento de Erros
O tratamento de erros é um aspecto crucial da programação robusta em C, envolvendo a antecipação, detecção e resolução de situações inesperadas durante a execução do programa.
Mecanismos Básicos de Tratamento de Erros
1. Verificação de Valores de Retorno
#include <stdio.h>
#include <stdlib.h>
FILE* safe_file_open(const char* filename) {
FILE* file = fopen(filename, "r");
if (file == NULL) {
perror("Erro ao abrir o arquivo");
exit(EXIT_FAILURE);
}
return file;
}
int main() {
FILE* file = safe_file_open("example.txt");
// Lógica de manipulação de arquivos
fclose(file);
return 0;
}
Estratégias de Tratamento de Erros
Abordagens de Tratamento de Erros
| Abordagem |
Descrição |
Prós |
Contras |
| Códigos de Retorno |
Usando valores inteiros de retorno |
Implementação simples |
Detalhes de erro limitados |
| Ponteiros de Erro |
Passando informações de erro |
Mais flexível |
Requer gerenciamento cuidadoso |
| Tipo Exceção |
Tratamento de erros personalizado |
Abrangente |
Mais complexo |
Fluxo de Trabalho de Tratamento de Erros
graph TD
A[Condição Potencial de Erro] --> B{Ocorreu um Erro?}
B -->|Sim| C[Capturar Detalhes do Erro]
B -->|Não| D[Continuar Execução]
C --> E[Registrar Erro]
E --> F[Lidar/Recuperar]
F --> G[Fechamento/Reentrada Graciosa]
Técnicas Avançadas de Tratamento de Erros
1. Registro de Erros
#include <errno.h>
#include <string.h>
void log_error(const char* message) {
fprintf(stderr, "Erro: %s\n", message);
fprintf(stderr, "Erro do Sistema: %s\n", strerror(errno));
}
int main() {
FILE* file = fopen("nonexistent.txt", "r");
if (file == NULL) {
log_error("Falha ao abrir o arquivo");
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
2. Estrutura de Tratamento de Erros Personalizada
typedef struct {
int code;
char message[256];
} ErrorContext;
ErrorContext global_error = {0, ""};
void set_error(int code, const char* message) {
global_error.code = code;
strncpy(global_error.message, message, sizeof(global_error.message) - 1);
}
int process_data() {
// Condição de erro simulada
if (some_error_condition) {
set_error(100, "Processamento de dados falhou");
return -1;
}
return 0;
}
Boas Práticas de Tratamento de Erros
- Sempre verifique os valores de retorno
- Utilize mensagens de erro significativas
- Implemente registro abrangente
- Forneça caminhos claros de recuperação de erros
- Evite expor detalhes sensíveis do sistema
Funções Comuns de Tratamento de Erros
perror()
strerror()
errno
Recomendações de Tratamento de Erros do LabEx
No LabEx, recomendamos:
- Abordagem consistente de tratamento de erros
- Documentação abrangente de erros
- Implementação de múltiplas camadas de verificação de erros
- Utilização de ferramentas de análise estática para detectar erros potenciais
Princípios de Programação Defensiva
- Valide todas as entradas
- Verifique a alocação de recursos
- Implemente mecanismos de tempo limite
- Forneça estratégias de fallback
Tratamento de Erros em Chamadas de Sistema
#include <unistd.h>
#include <errno.h>
ssize_t safe_read(int fd, void* buffer, size_t count) {
ssize_t bytes_read;
while ((bytes_read = read(fd, buffer, count)) == -1) {
if (errno != EINTR) {
perror("Erro de leitura");
return -1;
}
}
return bytes_read;
}