|
|
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 |