C - Tratamento de Erros
Como tal, a programação C não fornece suporte direto para tratamento de erros, mas sendo uma linguagem de programação do sistema, fornece acesso em um nível inferior na forma de valores de retorno. A maioria das funções C ou mesmo Unix retornam -1 ou NULL em caso de qualquer erro e definem um código de erroerrno. É 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 de 0 indica que não há erro no programa.
errno, perror (). e strerror ()
A linguagem de programação C fornece perror() e strerror() funções que podem ser usadas para exibir a mensagem de texto associada com errno.
o perror() função exibe a string que você passa para ela, seguida por dois pontos, um espaço e a representação textual do valor errno atual.
o strerror() função, que retorna um ponteiro para a representação textual do valor errno atual.
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. O segundo ponto importante a observar é que você deve usarstderr fluxo de arquivo para a saída de todos os erros.
#include <stdio.h>
#include <errno.h>
#include <string.h>
extern int errno ;
int main () {
FILE * pf;
int errnum;
pf = fopen ("unexist.txt", "rb");
if (pf == NULL) {
errnum = errno;
fprintf(stderr, "Value of errno: %d\n", errno);
perror("Error printed by perror");
fprintf(stderr, "Error opening file: %s\n", strerror( errnum ));
} else {
fclose (pf);
}
return 0;
}
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Value of errno: 2
Error printed by perror: No such file or directory
Error opening file: No such file or directory
Dividir por zero erros
É um problema comum que na hora de dividir qualquer número, os programadores não verifiquem se um divisor é zero e, finalmente, ele cria um erro de tempo de execução.
O código a seguir corrige isso verificando se o divisor é zero antes de dividir -
#include <stdio.h>
#include <stdlib.h>
main() {
int dividend = 20;
int divisor = 0;
int quotient;
if( divisor == 0){
fprintf(stderr, "Division by zero! Exiting...\n");
exit(-1);
}
quotient = dividend / divisor;
fprintf(stderr, "Value of quotient : %d\n", quotient );
exit(0);
}
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Division by zero! Exiting...
Status de saída do programa
É uma prática comum sair com um valor de EXIT_SUCCESS no caso do programa sair após uma operação bem-sucedida. Aqui, EXIT_SUCCESS é uma macro e é definido como 0.
Se você tem uma condição de erro em seu programa e está saindo, você deve sair com um status EXIT_FAILURE que é definido como -1. Então, vamos escrever o programa acima da seguinte maneira -
#include <stdio.h>
#include <stdlib.h>
main() {
int dividend = 20;
int divisor = 5;
int quotient;
if( divisor == 0) {
fprintf(stderr, "Division by zero! Exiting...\n");
exit(EXIT_FAILURE);
}
quotient = dividend / divisor;
fprintf(stderr, "Value of quotient : %d\n", quotient );
exit(EXIT_SUCCESS);
}
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
Value of quotient : 4