www.samueldiasneto.com: Tratamento de erro na linguagem C

Pesquisar em todo o site
Se esta página lhe ajudar, considere fazer uma doação

Toda a programação em linguagem C é baseada em funções (até mesmo main() é uma função). O valor de retorno de uma função indica se esta foi executada com sucesso ou não.

Por convenção, funções que retornam um valor inteiro indicam erro quando retornam -1. Qualquer outro valor retornado indica sucesso. Normalmente se usa o valor zero ou valores positivos para indicar o sucesso.

Se a função retorna um ponteiro, a falha é indicada pelo retorno de um ponteiro NULL. Qualquer ponteiro não nulo indica sucesso.

Como as funções que retornam valores inteiros normalmente usam o valor -1 para indicar que houve alguma falha, você pode usar o seguinte código para identificar se ocorreu algum erro numa chamada a uma função que retorna um valor inteiro:

if((VARIÁVEL = FUNÇÃO) < 0) /* um erro ocorreu */
  {
    COMANDOS PARA TRATAMENTO DO ERRO
  }

Se a função retorna um ponteiro, normalmente o erro é indicado por um ponteiro nulo e você pode usar o código:

if((VARIÁVEL = FUNÇÃO) == 0) /* um erro ocorreu */
  {
    COMANDOS PARA TRATAMENTO DO ERRO
  }

 

Antigamente, quando uma função falhava, o erro era indicado através de uma variável externa especial chamada errno. A função retornava -1 (no caso de valores inteiros), ou NULL (no caso de ponteiros) e armazenava o código do tipo de erro em errno. Exemplo:

#include <stdio.h>
#include <stdlib.h>

int main()
  {
    extern int errno;
    FILE *arquivo;

   if((arquivo = fopen("arquivoX","r")) == NULL)
      {
        printf("errno = %d\n",errno); /* exibindo o código de erro */
        exit(errno);
      }

    return(0);
  }

O programa acima compilado e executado deve gerar uma saída assim:

$ ./erro1
errno = 2
$ echo $?
2

Observe que o arquivo "arquivoX" não deve existir para este exemplo funcionar.

 

Atualmente você não precisa declarar errno como uma variável externa, basta incluir o arquivo de cabeçalho errno.h e você já pode usar errno. Além disso foram definidas várias macros que referenciam os erros codificados por errno. Abaixo podemos ver uma lista com algumas delas:

MACRO                DESCRIÇÃO DO ERRO
E2BIG Lista de argumentos muito longa
EACCESS Permissão negada
EFBIG Arquivo muito grande
EINVAL Argumento inválido
EIO Erro de entrada/saída
ENOENT Arquivo ou diretório inexistente

Para ver a lista completa dê uma olhada na manpage do errno:

man errno

A utilização destas macros permite que você personalize sua mensagem de erro. Por exemplo:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

/* usando macros para personalizar suas mensagens de erro */

int main(int argc, char *argv[]){
  FILE *arquivo;

  if((arquivo = fopen(argv[1],"r")) == NULL){
    if(errno == ENOENT){
      printf("Erro: O arquivo %s não existe.\n",argv[1]);
      exit(errno);
    }
  }  

  fclose(arquivo);
    
  return(0);
}

Rodando o exemplo:

$ ./erro2 arquivoX
Erro: O arquivo arquivoX não existe.
$ echo $?
84

Observe que "arquivoX" não existe e o programa emite a mensagem de erro personalizada. Observe também que o valor de errno é diferente do primeiro exemplo. Esta é a nova definição de errno.

 

Você também pode usar a função strerror() para exibir uma mensagem ao usuário indicando o erro, porém normalmente estas mensagens retornam em inglês. Esta função faz parte do arquivo de cabeçalho string.h. Veja um exemplo do uso de strerror():

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>

/* usando strerror() */

int main(int argc, char *argv[]){
  FILE *arquivo;

  if((arquivo = fopen(argv[1],"r")) == NULL){
      printf("%s.\n",strerror(errno));
      exit(errno);
    }

  fclose(arquivo);
    
  return(0);
}

Execução:

$ ./errno3 arquivoX
No such file or directory.

É importante lembrar que a string retornada por strerror() só é válida até que esta função seja chamada novamente.


Se esta página lhe ajudou, considere fazer uma doação