Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Industrial programming >> Linguagem C

Dominando Tratamento de Erros em C: Boas Práticas e Técnicas

Como tal, a programação C não fornece suporte direto para tratamento de erros, mas sendo uma linguagem de programação de sistema, fornece acesso em nível inferior na forma de valores de retorno. A maioria das chamadas de função C ou Unix retorna -1 ou NULL em caso de erro e define um código de erro errno. Ele é 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 0 indica que não há erro no programa.

errno, perror() e strerror()

A linguagem de programação C fornece as funções perror() e strerror(), que podem ser usadas para exibir a mensagem de texto associada ao errno.

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. Segundo ponto importante: você deve usar o fluxo de arquivo stderr para exibir todos os erros.

#include <stdio.h>
#include <errno.h>
#include <string.h>
extern int errno;
int main() {
    FILE *pf;
    int errnum;
    pf = fopen("inexistente.txt", "rb");
    if (pf == NULL) {
        errnum = errno;
        fprintf(stderr, "Valor de errno: %d\n", errno);
        perror("Erro impresso por perror");
        fprintf(stderr, "Erro ao abrir arquivo: %s\n", strerror(errnum));
    } else {
        fclose(pf);
    }
    return 0;
}

Quando o código acima é compilado e executado, produz o seguinte resultado:

Valor de errno: 2
Erro impresso por perror: No such file or directory
Erro ao abrir arquivo: No such file or directory

Erros de Divisão por Zero

É um problema comum que, ao dividir qualquer número, os programadores não verificam se o divisor é zero e, finalmente, isso cria um erro em tempo de execução.

O código abaixo corrige isso verificando se o divisor é zero antes de dividir:

#include <stdio.h>
#include <stdlib.h>
main() {
    int dividendo = 20;
    int divisor = 0;
    int quociente;
    if (divisor == 0) {
        fprintf(stderr, "Divisão por zero! Saindo...\n");
        exit(-1);
    }
    quociente = dividendo / divisor;
    fprintf(stderr, "Valor do quociente: %d\n", quociente);
    exit(0);
}

Quando o código acima é compilado e executado, produz o seguinte resultado:

Divisão por zero! Saindo...

Status de Saída do Programa

É uma prática comum sair com um valor de EXIT_SUCCESS em caso de o programa terminar após uma operação bem-sucedida. Aqui, EXIT_SUCCESS é uma macro e é definida como 0.

Se você tiver uma condição de erro no seu programa e estiver saindo, deve sair com status EXIT_FAILURE, que é definido como -1. Vamos reescrever o programa acima da seguinte forma:

#include <stdio.h>
#include <stdlib.h>
main() {
    int dividendo = 20;
    int divisor = 5;
    int quociente;
    if (divisor == 0) {
        fprintf(stderr, "Divisão por zero! Saindo...\n");
        exit(EXIT_FAILURE);
    }
    quociente = dividendo / divisor;
    fprintf(stderr, "Valor do quociente: %d\n", quociente);
    exit(EXIT_SUCCESS);
}

Quando o código acima é compilado e executado, produz o seguinte resultado:

Valor do quociente: 4

Linguagem C

  1. Manipulação de Arquivos em C: Dominando I/O com fopen, fprintf, fread e fseek
  2. Dominando Tratamento de Exceções em Java: Try, Catch, Finally, Throw e Throws Explicados
  3. Dominando Taxas de Erro de Código ADC: O Que Você Precisa Saber
  4. Melhores Práticas para Armazenamento e Manuseio de Correias de Transmissão de Potência
  5. Operações de Arquivo em C# – Guia Prático
  6. Domine o Tratamento de Sinais em C++: Gestão Segura de Interrupções e Término Limpo de Programas
  7. Dominando Tratamento de Exceções em C#: Estratégias e Boas Práticas
  8. Tratamento de Exceções em Python: Guia Completo
  9. Dominando a Segurança no Manuseio de Materiais: Melhores Práticas para Operações Eficientes e Livres de Risco
  10. Entendendo Manuseio de Materiais: Conceitos-Chave e Melhores Práticas