Manejo de errores en programas C

Aunque C no proporciona soporte directo para el manejo de errores (o manejo de excepciones), hay formas a través de las cuales se puede realizar el manejo de errores en C. Un programador tiene que prevenir errores en primer lugar y probar los valores de retorno de las funciones.
Muchas llamadas a funciones de C devuelven un -1 o NULL en caso de error, por lo que la prueba rápida de estos valores devueltos se realiza fácilmente con, por ejemplo, una declaración ‘if’. Por ejemplo, en la programación de sockets , el valor devuelto de las funciones como socket(), listen(), etc. se verifican para ver si hay un error o no.

Ejemplo: manejo de errores en la programación de sockets

if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0)
{
   perror("socket failed");
   exit(EXIT_FAILURE);
}

Diferentes métodos de manejo de errores en C

  1. Variable global errno: cuando se llama a una función en C, a una variable llamada errno se le asigna automáticamente un código (valor) que se puede usar para identificar el tipo de error que se ha encontrado. Es una variable global que indica que el error ocurrió durante cualquier llamada de función y se define en el archivo de encabezado errno.h.
    Diferentes códigos (valores) para errno significan diferentes tipos de errores. A continuación se muestra una lista de algunos valores errno diferentes y su significado correspondiente:
    errno value       Error
    1             /* Operation not permitted */
    2             /* No such file or directory */
    3             /* No such process */
    4             /* Interrupted system call */
    5             /* I/O error */
    6             /* No such device or address */
    7             /* Argument list too long */
    8             /* Exec format error */
    9             /* Bad file number */
    10            /* No child processes */
    11            /* Try again */
    12            /* Out of memory */
    13            /* Permission denied */
    
    

    // C implementation to see how errno value is
    // set in the case of any error in C
    #include <stdio.h>
    #include <errno.h>
      
    int main()
    {
        // If a file is opened which does not exist,
        // then it will be an error and corresponding
        // errno value will be set
        FILE * fp;
      
        // opening a file which does
        // not exist.
        fp = fopen("GeeksForGeeks.txt", "r");
      
        printf(" Value of errno: %d\n ", errno);
      
        return 0;
    }

    Producción:

    Value of errno: 2
    

    Nota: Aquí, el errno se establece en 2, lo que significa que no existe tal archivo o directorio. En el IDE en línea, puede dar el error n.º 13, que dice permiso denegado.

  2. perror() y strerror(): El valor errno obtenido arriba indica los tipos de error encontrados.
    Si es necesario mostrar la descripción del error, hay dos funciones que se pueden usar para mostrar un mensaje de texto asociado con el error no. Las funciones son:
    • perror: muestra la string que le pasa, seguida de dos puntos, un espacio y luego la representación textual del valor actual de errno.
      Sintaxis:
      void perror (const char *str)
      str: is a string containing a custom message
      to be printed before the error message itself.
    • strerror(): devuelve un puntero a la representación textual del valor errno actual.
      Sintaxis:
      char *strerror (int errnum)
      errnum: is the error number (errno).

    // C implementation to see how perror() and strerror()
    // functions are used to print the error messages.
    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
      
    int main()
    {
        FILE *fp;
      
        // If a file is opened which does not exist,
        // then it will be an error and corresponding
        // errno value will be set
        fp = fopen(" GeeksForGeeks.txt ", "r");
      
        // opening a file which does
        // not exist.
        printf("Value of errno: %d\n ", errno);
        printf("The error message is : %s\n"
                             strerror(errno));
        perror("Message from perror");
      
        return 0;
    }

    Salida:
    En el escritorio personal:

    Value of errno: 2
    The error message is : No such file or directory
    Message from perror: No such file or directory
    

    En IDE en línea:

     Value of errno: 13
    The error message is : Permission denied
    

    Nota: La función perror() muestra una string que se le pasa, seguida de dos puntos y el mensaje de texto del valor errno actual.

  3. Estado de salida: el estándar C especifica dos constantes: EXIT_SUCCESS y EXIT_FAILURE, que se pueden pasar a exit() para indicar una terminación exitosa o no exitosa, respectivamente. Estas son macros definidas en stdlib.h.

    // C implementation which shows the
    // use of EXIT_SUCCESS and EXIT_FAILURE.
    #include <stdio.h>
    #include <errno.h>
    #include <string.h>
    #include <stdlib.h>
      
    int main()
    {
        FILE * fp;
        fp = fopen ("filedoesnotexist.txt", "rb");
      
        if (fp == NULL)
        {
            printf("Value of errno: %d\n", errno);
            printf("Error opening the file: %s\n",
                                 strerror(errno));
            perror("Error printed by perror");
      
            exit(EXIT_FAILURE);
            printf("I will not be printed\n");
        }
      
        else
        {
            fclose (fp);
            exit(EXIT_SUCCESS);
            printf("I will not be printed\n");
        }
        return 0;
    }

    Producción:

    Value of errno: 2
    Error opening the file: No such file or directory
    Error printed by perror: No such file or directory
    
  4. Errores de división por cero: un error común que cometen los programadores de C es no verificar si un divisor es cero antes de un comando de división. La división por cero conduce a un comportamiento indefinido, no hay una construcción de lenguaje C que pueda hacer algo al respecto. Lo mejor que puedes hacer es no dividir por cero en primer lugar, comprobando el denominador.

    // C program to check  and rectify
    // divide by zero condition
    #include<stdio.h>
    #include <stdlib.h>
      
    void function(int);
      
    int main()
    {
        int x = 0;
        function(x);
        return 0;
    }
      
    void function(int x)
    {
        float fx;
      
        if (x==0)
        {
            printf("Division by Zero is not allowed");
            fprintf(stderr, "Division by zero! Exiting...\n");
            exit(EXIT_FAILURE);
        }
        else
        {
            fx = 10 / x;
            printf("f(x) is: %.5f", fx);
        }
    }

    Producción:

    Division by Zero is not allowed

Este artículo es una contribución de MAZHAR IMAM KHAN . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *