Lanzar una excepción en C

Waqar Aslam 12 octubre 2023
  1. una descripción general de la excepción
  2. Manejar una excepción en el lenguaje de programación C
  3. la función setjmp() para manejar errores en C
  4. Implementar el manejo de errores con errno en C
  5. Use perror() y strerror() para imprimir los mensajes de error
  6. Manejo de la división por cero errores
Lanzar una excepción en C

Este artículo explica cómo lidiar con una excepción o error en el lenguaje de programación C.

una descripción general de la excepción

Un intento de dividir por cero es un ejemplo de una situación que podría desencadenar una excepción, que es una reacción a un escenario extraordinario que puede ocurrir mientras se ejecuta un programa.

El control se puede pasar de una sección de un programa a otra con la ayuda de una excepción.

Manejar una excepción en el lenguaje de programación C

Aunque C no proporciona soporte directo para el manejo de errores (también conocido como manejo de excepciones), existen métodos en los que se puede lograr el manejo de errores en C. Para evitar problemas en primer lugar, un programador debe tomar precauciones y examinar los valores devueltos. por las funciones.

En caso de error, muchas llamadas a funciones C devuelven el valor -1 o NULL. Por lo tanto, la realización de una prueba rápida en estos valores devueltos se puede lograr de manera rápida y eficiente utilizando, por ejemplo, una declaración if.

la función setjmp() para manejar errores en C

Es posible simular la funcionalidad de manejo de excepciones de otros lenguajes de programación utilizando la función setjmp(). La primera vez que se llama a setjmp(), se almacena un punto de referencia en el punto actual en la ejecución del programa.

Este punto de referencia seguirá siendo válido mientras la función que contiene setjmp() no regrese o salga. Cuando realiza una llamada a longjmp(), la ejecución volverá al punto donde se produjo la llamada correspondiente a setjmp().

El parámetro de setjmp() es jmp buf, que es un tipo que puede contener un contexto de ejecución, y devuelve 0 en la primera ocasión en que se ejecuta (cuando establece el punto de retorno). El valor proporcionado a longjmp() se devuelve cuando el programa se ejecuta por segunda vez, cuando se llama a longjmp().

Se requiere un jmp buf proporcionado previamente a setjmp() como entrada para longjmp(), junto con un valor que debe pasarse a setjmp() como valor de retorno.

Cuando ocurren fallas en llamadas a funciones profundamente anidadas, sería tedioso verificar los valores devueltos al lugar al que desea regresar. Aquí es donde setjmp() y longjmp() resultan más útiles.

Código fuente:

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

int main(void) {
  int value;
  jmp_buf environment;

  value =
      setjmp(environment);  // value is set to 0 the first time this is called

  if (value != 0) {
    printf("You have just executed a longjmp call, and the return value is %d.",
           value);  // now, value is 1, passed from longjmp()
    exit(0);
  }

  puts("Performing longjmp call\n");
  longjmp(environment, 1);

  return (0);
}

Producción :

Performing longjmp call

You have just executed a longjmp call, and the return value is 1

Implementar el manejo de errores con errno en C

Cuando se ejecuta una llamada de función en C, una variable conocida como errno recibe una asignación automática de un código (valor) que puede ser utilizado para determinar el problema encontrado. Este código se puede usar para señalar dónde ocurrió el error.

Es una variable global que te dice qué tipo de error ocurrió cuando llamaste a cualquier función, y se especifica en el archivo de cabecera errno.h. Los errores de varios tipos se denotan mediante distintos códigos o valores para la variable errno.

La siguiente es una lista de muchos valores distintos de errno, cada uno correspondiente a un significado específico.

Valor errno Mensaje de error
1 operación no permitida
2 El fichero o directorio no existe
3 No hay tal proceso
4 Llamada al sistema interrumpida
5 error de E/S
6 No hay tal dispositivo o dirección
7 Lista de argumentos demasiado larga
8 Error de formato ejecutivo
9 Número de archivo incorrecto
10 Sin procesos secundarios
11 Intentar otra vez
12 Sin memoria
13 Permiso denegado

Código fuente:

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

int main() {
  FILE* fp;

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

  printf("The value of errno is: %d\n", errno);

  return 0;
}

Producción :

The value of errno is: 2

En este caso, el errno se pone a 2, lo que indica que no existe ni un archivo ni un directorio con ese nombre.

Use perror() y strerror() para imprimir los mensajes de error

Los tipos de errores que se encontraron están indicados por el valor errno que se obtuvo arriba.

Si es necesario mostrar la descripción del error, se pueden utilizar dos funciones para mostrar un mensaje de texto relacionado con el n.º de error.

El perror() muestra la cadena que proporcionas, inserta un espacio, luego los dos puntos y, finalmente, describe el valor errno. El strerror() se refiere a la descripción del valor actual de errno.

Código fuente:

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

int main() {
  FILE *fp;
  fp = fopen(" abc.txt ", "r");

  printf("The value of errno is: %d\n", errno);
  printf("The error message is: %s\n", strerror(errno));
  perror("perror Message");

  return 0;
}

Producción :

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

Manejo de la división por cero errores

Cuando se trata de errores o excepciones, este es, con mucho, el problema más común que se plantea para la discusión.

Con frecuencia, presentaremos afirmaciones matemáticas como:

c = a / b;

Pero a menudo olvidamos que el valor de b probablemente sea cero en algunas circunstancias.

La división de un número entero por cero no está permitida en matemáticas. La gente a menudo cree que nunca se puede llegar a la solución, lo que significa que la solución es infinita.

Desafortunadamente, este no es el caso. En este escenario particular, la respuesta correcta es no especificado. Usando los principios de manejo de excepciones y errores en C, el siguiente es un programa que resolverá este problema.

Código fuente:

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

int main() {
  int dividend;
  int divisor;
  int quotient;

  printf("Enter the value for dividend: ");
  scanf("%d", &dividend);

  printf("Enter the value for divisor: ");
  scanf("%d", &divisor);

  if (divisor == 0) {
    fprintf(stderr, "\nDivision by zero is not possible!\n");
    exit(-1);
  }

  quotient = dividend / divisor;
  fprintf(stderr, "The value of quotient: %d\n", quotient);
  exit(0);
  return 0;
}

Producción:

Introduzca un valor cero.

Enter the value for dividend: 100
Enter the value for divisor: 0

Division by zero is not possible!

Introduzca un valor distinto de cero.

Enter the value for dividend: 100
Enter the value for divisor: 5
The value of quotient: 20
Waqar Aslam avatar Waqar Aslam avatar

I am Waqar having 5+ years of software engineering experience. I have been in the industry as a javascript web and mobile developer for 3 years working with multiple frameworks such as nodejs, react js, react native, Ionic, and angular js. After which I Switched to flutter mobile development. I have 2 years of experience building android and ios apps with flutter. For the backend, I have experience with rest APIs, Aws, and firebase. I have also written articles related to problem-solving and best practices in C, C++, Javascript, C#, and power shell.

LinkedIn

Artículo relacionado - C Exception