Erros e EXIT_FAILURE

Erros e EXIT_FAILURE

by André Luis Porto da Silva -
Number of replies: 1
Professor, eu tenho que presumir que toda a entrada de dados (algoritmo, nomes do arquivo de entrada e saída, número de edifícios, coordenadas dos edifícios) está correta ou eu preciso verificar e alertar erros?
E também se houver um erro (não necessariamente de entrada, como por exemplo na hora de salvar o arquivo de saida), eu posso encerrar com EXIT_FAILURE?
E, caso possa, queria saber se eu preciso fazer os frees e fcloses antes dele, ou se o EXIT_FAILURE já faz isso.
Obrigado.

In reply to André Luis Porto da Silva

Re: Erros e EXIT_FAILURE

by Francisco Reverbel -
Em geral você pode supor que os dados de entrada estão corretos. Se alguma coisa for muito fácil de verificar, então pode valer a pena fazer a verificação. Exemplo: Quando você olhar para o argv[1] (o primeiro argumento do programa, que especifica o algoritmo) para ver se ele é "1", "2" ou "3", não custa (quase) nada apresentar uma mensagem de erro se ele contiver outra coisa qualquer. Outras verificações podem ser omitidas. Exemplos: Pode passar diretamente para fopen os nomes de arquivo em argv[2], argv[3] e argv[4] , sem verificar se algum usuário sacana especificou nomes iguais para os arquivo de entrada e de saída, pode ignorar qualquer argv[i] com i>4, etc.

No final da execução do programa (em consequencia de uma chamada exit(EXIT_FAILURE) ou por outro motivo qualquer, como por exemplo um comando return na função main) toda a memória alocada por chamadas a malloc é liberada e todos os arquivos abertos por chamadas a fopen são fechados. Em outras palavras, o exit implicitamente faz todos os frees e fcloses que forem necessários.

Nos casos em que o programa acaba de modo anormal (porque malloc devolveu NULL, ou porque fopen não conseguiu abrir algum arquivo), use o fato que o exit já toma as providências finais que têm de ser tomadas. Seria muito chato rastrear todas as pendências para dar frees e fcloses antes de cada chamada exit(EXIT_FAILURE) (dentro de mallocx, por exemplo).

No caso do programa acabar normalmente, faça com que ele execute explicitamente todos os frees e fcloses antes de encerrar a execução. A rigor isso não é necessário, mas é bom para gente não esquecer que free e fclose existem...