C - Manejo de errores

Como tal, la programación en C no proporciona soporte directo para el manejo de errores, pero al ser un lenguaje de programación del sistema, le brinda acceso a un nivel inferior en forma de valores de retorno. La mayoría de las llamadas a funciones C o incluso Unix devuelven -1 o NULL en caso de cualquier error y establecen un código de errorerrno. Se establece como una variable global e indica que ocurrió un error durante cualquier llamada de función. Puede encontrar varios códigos de error definidos en el archivo de encabezado <error.h>.

Entonces, un programador de C puede verificar los valores devueltos y puede tomar la acción apropiada dependiendo del valor de retorno. Es una buena práctica establecer errno en 0 al momento de inicializar un programa. Un valor de 0 indica que no hay ningún error en el programa.

errno, perror (). y strerror ()

El lenguaje de programación C proporciona perror() y strerror() funciones que se pueden utilizar para mostrar el mensaje de texto asociado con errno.

  • los perror() La función muestra la cadena que le pasa, seguida de dos puntos, un espacio y luego la representación textual del valor actual de errno.

  • los strerror() función, que devuelve un puntero a la representación textual del valor actual de errno.

Intentemos simular una condición de error e intentemos abrir un archivo que no existe. Aquí estoy usando ambas funciones para mostrar el uso, pero puede usar una o más formas de imprimir sus errores. El segundo punto importante a tener en cuenta es que debe usarstderr flujo de archivos para generar todos los errores.

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

extern int errno ;

int main () {

   FILE * pf;
   int errnum;
   pf = fopen ("unexist.txt", "rb");
	
   if (pf == NULL) {
   
      errnum = errno;
      fprintf(stderr, "Value of errno: %d\n", errno);
      perror("Error printed by perror");
      fprintf(stderr, "Error opening file: %s\n", strerror( errnum ));
   } else {
   
      fclose (pf);
   }
   
   return 0;
}

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

Value of errno: 2
Error printed by perror: No such file or directory
Error opening file: No such file or directory

Dividir por cero errores

Es un problema común que a la hora de dividir cualquier número, los programadores no comprueban si un divisor es cero y finalmente crea un error en tiempo de ejecución.

El siguiente código corrige esto verificando si el divisor es cero antes de dividir:

#include <stdio.h>
#include <stdlib.h>

main() {

   int dividend = 20;
   int divisor = 0;
   int quotient;
 
   if( divisor == 0){
      fprintf(stderr, "Division by zero! Exiting...\n");
      exit(-1);
   }
   
   quotient = dividend / divisor;
   fprintf(stderr, "Value of quotient : %d\n", quotient );

   exit(0);
}

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

Division by zero! Exiting...

Estado de salida del programa

Es una práctica común salir con un valor de EXIT_SUCCESS en caso de que el programa salga después de una operación exitosa. Aquí, EXIT_SUCCESS es una macro y se define como 0.

Si tiene una condición de error en su programa y está saliendo, debe salir con un estado EXIT_FAILURE que se define como -1. Así que escribamos el programa anterior de la siguiente manera:

#include <stdio.h>
#include <stdlib.h>

main() {

   int dividend = 20;
   int divisor = 5;
   int quotient;
 
   if( divisor == 0) {
      fprintf(stderr, "Division by zero! Exiting...\n");
      exit(EXIT_FAILURE);
   }
	
   quotient = dividend / divisor;
   fprintf(stderr, "Value of quotient : %d\n", quotient );

   exit(EXIT_SUCCESS);
}

Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:

Value of quotient : 4