Introducción al Manejo de Excepciones en C

Para comenzar a utilizar el SEH (Structured Exception Handling) primero que nada comenzaremos definiendo que es una “Excepción“.

Excepción:

Es un evento que ocurre durante la ejecución de un programa y require la ejecución de codigo fuera del flujo normal de control.


Hay dos tipos de excepciones:

  • Excepciones de Software

    Suceden cuando por ejemplo el programa pasa un parámetro invalido

  • Excepciones de Hardware

    Son iniciadas por el CPU y ocurren cuando son ejecutadas secuencias de código invalidas como una división por zero

Las cuales serán tratadas de la misma forma por nuestro manejador de excepciones.

Bloque de Código SEH

__try
{
    /* Bloque de código  en el cual podría generarse una excepción*/
}
   __except(/*Expresión de filtrado*/)
   {
      /* Bloque de código el cual se ejecutará inmediatamente después de que se produzca la excepción en el bloque anterior */
   }

El bloque de codigo anterior es la estructura la cual nos servirá para manejar las excepciones.
Ahora ¿cómo saber que bloque de código meter en “try”?

Para que nos demos una idea aplicaremos el SEH en estos casos:

  • Manipulación de arrays.
  • Operaciones matemáticas.
  • Al llamar una función que puede generar una excepción a propósito o por que no ha sido bien testeada.
  • Errores de sistema que puedan ocurrir y en vez de terminar el programa continuar su ejecución.

Ejemplo de uso de SEH

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

int main()
{
	__try
	{
			int x,y = 0;
			int z;
			z = x / y;
	}
	__except(EXCEPTION_EXECUTE_HANDLER)
	{
		MessageBoxA(0,"Capturamos la excepcion","SEH Activo",0);
	}

	return 0;
}

Como podemos ver en el anterior ejemplo de código, dentro de try incluimos una división por 0, al ejecutarse ese bloque inmediatamente se salta al bloque de “except” el cual siempre se le pasará un parámetro definido ya en unas constantes:

  • EXCEPTION_EXECUTE_HANDLER

    Se ejecuta inmediatamente el bloque de código contenido en __except

  • EXCEPTION_CONTINUE_SEARCH

    El sistema ignora el manejador de excepciones y busca por un manejador de excepciones dentro del bloque, y continua hasta que encuentra un manejador

  • EXCEPTION_CONTINUE_EXECUTION

    El sistema inmediatamente regresa el control al punto en el cual la exepción ocurrió aunque no es posible continuar después de que ocurran “ciertas” excepciones.

Y esto ha sido solamente una introducción al manejo de SEH al menos en C.
Si alguien tiene alguna duda o sugerencia con respecto a este artículo sería bueno que lo comente.

Eduardo says:

Como hago para evitar que al pedir un numero el usuario torpe me escriba “juanito” o al pedir el nombre el usuario me escriba “54321″
gracias al que me pueda ayudar