Manejo de errores en C

Naila Saad Siddiqui 12 octubre 2023
  1. Manejo de errores en C
  2. Usar variable global errno
  3. Usar las funciones perrerror() y strerror()
  4. Utilice EXIT_STATUS
  5. Conclusión
Manejo de errores en C

Este breve artículo trata sobre la discusión sobre las diferentes formas que se pueden usar para manejar los errores en los programas en lenguaje C.

Manejo de errores en C

Aunque el manejo de errores (o el manejo de excepciones) no es compatible directamente con C, todavía hay formas de manejar los errores en el lenguaje. Un programador debe probar los valores de retorno de la función e intentar evitar que ocurran errores en primer lugar.

Se puede realizar rápidamente una prueba rápida de estos valores devueltos. Por ejemplo, una sentencia if porque muchas funciones de C devuelven un -1 o NULL en caso de error.

Se pueden usar diferentes métodos para manejar diferentes tipos de errores en lenguaje C. Algunos de ellos se discuten en este artículo.

  1. Utilizar la variable global errno.
  2. Uso de las funciones perror() y strerror() en lenguaje C.
  3. Utilice el estado Salir de la función.

Usar variable global errno

Una variable global errno se define en el archivo de biblioteca errorno.h. En el lenguaje de programación C, a una variable llamada errno se le asigna automáticamente un código (valor) que se puede usar para especificar el error que ocurrió.

Los tipos de error se indican mediante diferentes códigos (valores) para errno. Aquí hay una lista de algunos valores diferentes de errno y sus explicaciones.

Código de error Descripción
1 Esta operación no está permitida.
2 No se encuentra el archivo o directorio.
3 Función no encontrada.
4 Cualquier llamada del sistema interrumpida.
5 Error de entrada o salida.
6 No se encontró tal dispositivo.
7 La lista de argumentos aprobada es más larga de lo especificado.
8 Error de función ejecutiva.
9 Error de número de archivo incorrecto.
10 Chile proceso no encontrado.
11 Pruébalo otra vez.
12 Error de falta de memoria.
13 Se deniega el permiso de acceso.

Consideremos un segmento de código de ejemplo en el que intentaremos abrir un archivo que no existe. Luego veremos el valor de la variable errno.

Ejemplo de código:

#include <errno.h>
#include <stdio.h>
int main() {
  FILE* file;
  // we're trying to open a file that doesn't exist
  file = fopen("samepleFile.txt", "r");
  printf("The errorno Value is: %d\n ", errno);

  return 0;
}

En el ejemplo de código anterior, creamos un objeto para Archivo y luego llamamos a la función fopen() para que pudiera abrir un archivo para lectura. Pero le hemos dado un nombre de archivo que no se encuentra en el directorio.

Entonces creará un error y se establecerá un valor errno. Luego imprimiremos su valor.

Producción:

salida del programa de demostración errno

Desde la salida, el número de error devuelto es 2. De la tabla anterior se puede hacer coincidir que 2 significa "no such file or directory was found".

Usar las funciones perrerror() y strerror()

Los tipos de error encontrados se indican mediante el valor errno obtenido anteriormente.

Si la descripción del error es necesaria, se pueden utilizar dos funciones para mostrar un mensaje de texto vinculado al número de error. Estos son perror() y strerror().

  • La función perror() muestra el mensaje de texto definido por el usuario para el error, seguido del mensaje real configurado para ese errno.

    Sintaxis:

    void perror(const char *str)
    

    El str es la cadena del mensaje personalizado que debe mostrar antes del mensaje de error real.

  • El strerror devuelve el mensaje de texto configurado para el errno que se le pasó.

    Sintaxis:

    char *strerror(int errnum)
    

    El errnum es el número de error que se le pasa.

Modificaremos el ejemplo anterior para abrir un archivo inexistente y mostrar los mensajes de error a través de perror() y strerror().

Ejemplo de código:

#include <errno.h>
#include <stdio.h>

int main() {
  FILE* file;
  // we're trying to open a file that doesn't exist
  file = fopen("samepleFile.txt", "r");

  if (file == NULL) {
    printf("Value of error number: %d\n", errno);
    perror("Error message by perror");
    printf("Error Message from strerror : %s\n", strerror(errno));
    `
  } else {
    fclose(file);
  }
  return 0;
}

En el segmento de código anterior, hemos impreso el valor errno, luego el mensaje de error usando perr y luego a través de strerror.

Producción:

Salida perror y strerror

Utilice EXIT_STATUS

Para indicar una finalización exitosa o fallida, el estándar C especifica dos macros constantes: EXIT EXIT y EXIT FAILURE, que se pueden pasar a exit(). Estas macros son las listadas en stdlib.h.

Seguiremos modificando el ejemplo anterior y haremos la llamada de salida fallida si no se encuentra el archivo y se encuentra una salida exitosa en el archivo del caso.

Ejemplo de código:

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
int main() {
  FILE* file;
  // we're trying to open a file that doesn't exist
  file = fopen("samepleFile.txt", "r");

  if (file == NULL) {
    int errorNumber = errno;
    printf("Value of error number: %d\n", errno);
    perror("Error message by perror");
    printf("Error Message from strerror : %s\n", strerror(errno));
    exit(EXIT_FAILURE);
  } else {
    fclose(file);
    exit(EXIT_SUCCESS);
  }
  printf("Program exiting");
  return 0;
}

En el ejemplo de código anterior, hemos incluido la función de salida en ambos casos de la declaración condicional. Hemos agregado una función printf justo antes de que finalice el programa.

Este mensaje no se imprimirá ya que antes se saldría del programa.

Producción:

salida de valor de salida

Conclusión

C no tiene soporte explícito para el manejo de excepciones. Sin embargo, podemos usar ciertas primitivas de manejo de errores (es decir, funciones de biblioteca) para lograr un manejo de excepciones suficiente en C.

Artículo relacionado - C Error