Dominando Tratamento de Erros em C: Boas Práticas e Técnicas
Como tal, a programação C não fornece suporte direto para tratamento de erros, mas sendo uma linguagem de programação de sistema, fornece acesso em nível inferior na forma de valores de retorno. A maioria das chamadas de função C ou Unix retorna -1 ou NULL em caso de erro e define um código de erro errno. Ele é definido como uma variável global e indica que ocorreu um erro durante qualquer chamada de função. Você pode encontrar vários códigos de erro definidos no arquivo de cabeçalho <error.h>.
Portanto, um programador C pode verificar os valores retornados e tomar a ação apropriada dependendo do valor de retorno. É uma boa prática definir errno como 0 no momento de inicializar um programa. Um valor 0 indica que não há erro no programa.
errno, perror() e strerror()
A linguagem de programação C fornece as funções perror() e strerror(), que podem ser usadas para exibir a mensagem de texto associada ao errno.
A função perror() exibe a string que você passa para ela, seguida por dois pontos, um espaço e, em seguida, a representação textual do valor atual de errno.
A função strerror(), que retorna um ponteiro para a representação textual do valor atual de errno.
Vamos tentar simular uma condição de erro e tentar abrir um arquivo que não existe. Aqui estou usando ambas as funções para mostrar o uso, mas você pode usar uma ou mais maneiras de imprimir seus erros. Segundo ponto importante: você deve usar o fluxo de arquivo stderr para exibir todos os erros.
#include <stdio.h>
#include <errno.h>
#include <string.h>
extern int errno;
int main() {
FILE *pf;
int errnum;
pf = fopen("inexistente.txt", "rb");
if (pf == NULL) {
errnum = errno;
fprintf(stderr, "Valor de errno: %d\n", errno);
perror("Erro impresso por perror");
fprintf(stderr, "Erro ao abrir arquivo: %s\n", strerror(errnum));
} else {
fclose(pf);
}
return 0;
}
Quando o código acima é compilado e executado, produz o seguinte resultado:
Valor de errno: 2 Erro impresso por perror: No such file or directory Erro ao abrir arquivo: No such file or directory
Erros de Divisão por Zero
É um problema comum que, ao dividir qualquer número, os programadores não verificam se o divisor é zero e, finalmente, isso cria um erro em tempo de execução.
O código abaixo corrige isso verificando se o divisor é zero antes de dividir:
#include <stdio.h>
#include <stdlib.h>
main() {
int dividendo = 20;
int divisor = 0;
int quociente;
if (divisor == 0) {
fprintf(stderr, "Divisão por zero! Saindo...\n");
exit(-1);
}
quociente = dividendo / divisor;
fprintf(stderr, "Valor do quociente: %d\n", quociente);
exit(0);
}
Quando o código acima é compilado e executado, produz o seguinte resultado:
Divisão por zero! Saindo...
Status de Saída do Programa
É uma prática comum sair com um valor de EXIT_SUCCESS em caso de o programa terminar após uma operação bem-sucedida. Aqui, EXIT_SUCCESS é uma macro e é definida como 0.
Se você tiver uma condição de erro no seu programa e estiver saindo, deve sair com status EXIT_FAILURE, que é definido como -1. Vamos reescrever o programa acima da seguinte forma:
#include <stdio.h>
#include <stdlib.h>
main() {
int dividendo = 20;
int divisor = 5;
int quociente;
if (divisor == 0) {
fprintf(stderr, "Divisão por zero! Saindo...\n");
exit(EXIT_FAILURE);
}
quociente = dividendo / divisor;
fprintf(stderr, "Valor do quociente: %d\n", quociente);
exit(EXIT_SUCCESS);
}
Quando o código acima é compilado e executado, produz o seguinte resultado:
Valor do quociente: 4
Linguagem C
- Manipulação de Arquivos em C: Dominando I/O com fopen, fprintf, fread e fseek
- Dominando Tratamento de Exceções em Java: Try, Catch, Finally, Throw e Throws Explicados
- Dominando Taxas de Erro de Código ADC: O Que Você Precisa Saber
- Melhores Práticas para Armazenamento e Manuseio de Correias de Transmissão de Potência
- Operações de Arquivo em C# – Guia Prático
- Domine o Tratamento de Sinais em C++: Gestão Segura de Interrupções e Término Limpo de Programas
- Dominando Tratamento de Exceções em C#: Estratégias e Boas Práticas
- Tratamento de Exceções em Python: Guia Completo
- Dominando a Segurança no Manuseio de Materiais: Melhores Práticas para Operações Eficientes e Livres de Risco
- Entendendo Manuseio de Materiais: Conceitos-Chave e Melhores Práticas