Técnicas de Tratamento de Erros
Compreendendo Erros em Fluxos de Entrada
Erros em fluxos de entrada podem ocorrer devido a várias razões, como entrada inválida, estouro de buffer ou tipos de dados inesperados.
Mecanismos de Detecção de Erros
graph TD
A[Fluxo de Entrada] --> B{Verificação de Erro}
B -->|Entrada Válida| C[Processar Dados]
B -->|Entrada Inválida| D[Tratamento de Erro]
D --> E[Notificação ao Usuário]
D --> F[Repetir Entrada]
Estratégias Comuns de Tratamento de Erros
1. Verificação de Valor de Retorno
int read_integer() {
int value;
while (1) {
if (scanf("%d", &value) == 1) {
return value;
} else {
printf("Entrada inválida. Por favor, digite um número.\n");
// Limpar o buffer de entrada
while (getchar() != '\n');
}
}
}
2. Tratamento de Erros com errno
#include <errno.h>
#include <string.h>
int process_input(char *buffer, size_t size) {
errno = 0;
if (fgets(buffer, size, stdin) == NULL) {
if (errno != 0) {
fprintf(stderr, "Erro de entrada: %s\n", strerror(errno));
return -1;
}
}
return 0;
}
Tipos de Erros de Entrada
| Tipo de Erro |
Descrição |
Abordagem de Tratamento |
| Estouro de Buffer |
Entrada excede o tamanho do buffer |
Truncar ou rejeitar a entrada |
| Incompatibilidade de Tipo |
Tipo de entrada incorreto |
Solicitar nova entrada |
| Condição EOF |
Fim do fluxo de entrada |
Término gracioso |
Técnica Avançada de Tratamento de Erros
int robust_input(char *buffer, size_t size) {
// Limpar quaisquer estados de erro anteriores
clearerr(stdin);
// Tentar ler a entrada
if (fgets(buffer, size, stdin) == NULL) {
if (feof(stdin)) {
printf("Fim da entrada alcançado.\n");
return -1;
}
if (ferror(stdin)) {
printf("Ocorreu um erro no fluxo.\n");
clearerr(stdin);
return -1;
}
}
// Remover a nova linha final
buffer[strcspn(buffer, "\n")] = 0;
return 0;
}
Boas Práticas para Tratamento de Erros
- Sempre valide a entrada
- Forneça mensagens de erro claras
- Implemente mecanismos de repetição de entrada
- Utilize funções apropriadas de verificação de erros
A LabEx enfatiza a importância de um tratamento abrangente de erros para criar programas C robustos e amigáveis ao usuário.