• Viernes 8 de Noviembre de 2024, 20:56

Autor Tema:  Captura De Excepciones Ansi C  (Leído 3768 veces)

Emperorxdevil

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Captura De Excepciones Ansi C
« en: Domingo 22 de Julio de 2007, 05:58 »
0
Hola a todos.

Verán tengo un problemilla que todavía no he conseguido solucionar.

En C++ puedo usar try, catch y throw para gestionar las excepciones.

Pero resulta que tengo programar en ANSI C.

Investigué sobre el tema y vi que esto se hace con señales. Bien, pues resolví alguna duda pero cuando escribi este code para probar lo aprendido...

Código: Text
  1.  
  2. #include <stdio.h>
  3. #include <signal.h>
  4.  
  5. void manejador(int sig) {
  6. printf("\Excepción capturada\n");  
  7.            getchar();  
  8.      }
  9.      
  10.  
  11. int main() {
  12.    
  13.      signal(SIGUSR,manejador);
  14.    
  15.      printf(" %d",4/0);          
  16.      
  17. }
  18.  
  19.  

Me di cuenta de que la constante SIGUSR no estaba definida en signal.h
Abri el archivo y le di un valor arbitrario (en concreto 12) pensando que después de esto el problema estaría solucionado...

Pero no es asi, el programa genera el tipico error de W xp de que mandes el reporte de errores en vez de capturar el error.

Por qué usando SIGPFE si captura el error y una vez definida la constante SIGUSR  ( en signal.h)no? Puedo arreglarlo ?

Qué es lo que he hecho mal ? Porque este error es una prueba y lo que busco es escribir capturadores de excepciones para que los programas que haga.

En VB, usaba la API SetUnhandledExceptionFilter pero creo que no es viable esta solución porque para programas de consola tengo que incluir windows.h y son 300 kb + (con gcc), además si las librerias de C me lo pueden solucionar paso de esto.


A ver si pueden ayudarme, y gracias

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Captura De Excepciones Ansi C
« Respuesta #1 en: Domingo 22 de Julio de 2007, 16:26 »
0
De signal.h de Minix:
Código: Text
  1. #define SIGHUP             1  /* hangup */
  2. #define SIGINT             2  /* interrupt (DEL) */
  3. #define SIGQUIT            3  /* quit (ASCII FS) */
  4. #define SIGILL             4  /* illegal instruction */
  5. #define SIGTRAP            5  /* trace trap (not reset when caught) */
  6. #define SIGABRT            6  /* IOT instruction */
  7. #define SIGIOT             6  /* SIGABRT for people who speak PDP-11 */
  8. #define SIGUNUSED          7  /* spare code */
  9. #define SIGFPE             8  /* floating point exception */
  10. #define SIGKILL            9  /* kill (cannot be caught or ignored) */
  11. #define SIGUSR1           10  /* user defined signal # 1 */
  12. #define SIGSEGV           11  /* segmentation violation */
  13. #define SIGUSR2           12  /* user defined signal # 2 */
  14. #define SIGPIPE           13  /* write on a pipe with no one to read it */
  15. #define SIGALRM           14  /* alarm clock */
  16. #define SIGTERM           15  /* software termination signal from kill */
  17. #define SIGCHLD           17  /* child process terminated or stopped */
  18.  
  19. #define SIGEMT             7  /* obsolete */
  20. #define SIGBUS            10  /* obsolete */
  21.  

Pero... SIFUSR1 y 2 tienen ciertas funciones:
http://en.wikipedia.org/wiki/SIGUSR1
http://en.wikipedia.org/wiki/Signal_(compu...List_of_signals
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

Emperorxdevil

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: Captura De Excepciones Ansi C
« Respuesta #2 en: Domingo 22 de Julio de 2007, 17:09 »
0
Gracias por el aporte, aunque no sé por qué este code no intercepta la excepcion que desencadeno (corregí el valor en signal.h) ya que ahora uso raise:

Código: Text
  1.  
  2. #include <stdio.h>
  3. #include <signal.h>
  4.  
  5. void manejador(int sig) {
  6. printf("\Excepción capturada\n");
  7. system("PAUSE");
  8.        exit (0);    
  9.      }
  10.      
  11.  
  12. int main() {
  13.    
  14.      signal(SIGUSR1,manejador);
  15.    
  16.      printf(" %d",4);
  17.      raise(SIGUSR1);          
  18.      getchar();
  19. }
  20.  
  21.  

Gracias de antemano
Salu2

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Captura De Excepciones Ansi C
« Respuesta #3 en: Domingo 22 de Julio de 2007, 19:24 »
0
Es que no lo estas declarando como debe ser... mira aqui te dan ejemplos:
http://www.cplusplus.com/reference/clibrar...nal/signal.html
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

Emperorxdevil

  • Nuevo Miembro
  • *
  • Mensajes: 13
    • Ver Perfil
Re: Captura De Excepciones Ansi C
« Respuesta #4 en: Domingo 22 de Julio de 2007, 23:24 »
0
Gracias, ahora si entendi en que fallaba y aprendi a capturar la excepción a la que llamo.

Aunque me quejo de que la info de algunas las páginas no es suficiente (antes de ver ese link googlee y ningun ejemplo que vi me saco de la duda) o no esta bien explicada.

Salu2 y gracias