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 en C devuelven -1 o NULL en caso de error, por lo que la prueba rápida de estos valores devueltos se realiza fácilmente, por ejemplo, con una ‘declaración if’. Por ejemplo, en la programación de sockets, el valor devuelto de las funciones como socket (), listen (), etc. se comprueba 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. Error de variable global: Cuando se llama a una función en C, a una variable denominada errno se le asigna automáticamente un código (valor) que se puede utilizar para identificar el tipo de error que se ha encontrado. Es una variable global que indica el error ocurrido 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 de 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 */
    
    

    #include <stdio.h>

    #include <errno.h>

     

    int main()

    {

        

        

        

        FILE * fp;

     

        

        

        fp = fopen("GeeksForGeeks.txt", "r");

     

        printf(" Value of errno: %d
    "
    , errno);

     

        return 0;

    }

    Producción:

    Value of errno: 2
    

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

    / li>

  2. perror () y strerror (): El valor de errno obtenido arriba indica los tipos de error encontrados.
    Si es necesario mostrar la descripción del error, hay dos funciones que se pueden utilizar para mostrar un mensaje de texto asociado con errorno. Las funciones son:
    • perror: Muestra la cadena que le pasa, seguida de dos puntos, un espacio y luego la representación textual del valor de errno actual.
      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 actual de errno.
      Sintaxis:
      char *strerror (int errnum)
      errnum: is the error number (errno).

    #include <stdio.h>

    #include <errno.h>

    #include <string.h>

     

    int main ()

    {

        FILE *fp;

     

        

        

        

        fp = fopen(" GeeksForGeeks.txt ", "r");

     

        

        

        printf("Value of errno: %d
    "
    , errno);

        printf("The error message is : %s
    "

                             strerror(errno));

        perror("Message from perror");

     

        return 0;

    }

    Producción:
    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 cadena que se le pasa, seguida de dos puntos y el mensaje textual del valor actual de errno.

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

    #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
    "
    , errno);

            printf("Error opening the file: %s
    "
    ,

                                 strerror(errno));

            perror("Error printed by perror");

     

            exit(EXIT_FAILURE);

            printf("I will not be printed
    "
    );

        }

     

        else

        {

            fclose (fp);

            exit(EXIT_SUCCESS);

            printf("I will not be printed
    "
    );

        }

        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. Dividir por cero errores: Un error común de 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 existe una construcción del lenguaje C que pueda hacer algo al respecto. Su mejor apuesta es no dividir por cero en primer lugar, comprobando el denominador.

    #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...
    "
    );

            exit(EXIT_FAILURE);

        }

        else

        {

            fx = 10 / x;

            printf("f(x) is: %.5f", fx);

        }

    }

    Producción:

    Division by Zero is not allowed

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

Deja una respuesta

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