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