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