2010-08-27 20 views
5

¿Proporciona Linux un manejo de excepciones en C sin recurrir a C++? O bien, ¿cuál podría ser la mejor manera de implementar dicho manejo de excepciones? El objetivo es evitar comprobar los códigos de retorno para cada función llamada, pero hacer algo como C++ que es seguro para subprocesos y fácil de transportar.Manejo de excepciones en C sin C++ en Linux

+8

Los hombres reales usan setjmp()/longjmp(). –

+0

Gracias, lo verificaremos. ¿Existe una ventaja/desventaja al utilizar setjmp/longjmp sobre las señales como se propone a continuación? – stefangachter

Respuesta

3

nunca he oído hablar de Linux que proporciona nada por el estilo, pero esta página se describe el manejo de una biblioteca para C excepción de terceros: http://www.on-time.com/ddj0011.htm no he sido capaz de encontrar el enlace de descarga, sin embargo.

+0

Gracias, mientras tanto tropecé con el mismo sitio, pero no pude encontrar el código fuente tampoco. – stefangachter

+0

Aquí hay algunas consideraciones generales sobre el manejo de excpetion y comentarios sobre la implementación anterior: http://landheer-cieslak.com/wordpress/error-handling-in-c/ – stefangachter

7

Puede manejar las señales escribiendo sus manejadores de señal para ello. Algunas de estas señales documentadas en GNU son:

  • Señales de error del programa: se utilizan para informar errores graves del programa.
  • Señales de terminación: se usan para interrumpir y/o finalizar el programa.
  • Señales de alarma: se utilizan para indicar la expiración de los temporizadores.
  • Señales de E/S asíncronas: se utilizan para indicar que la entrada está disponible.
  • Señales de control de trabajos: señales utilizadas para respaldar el control de trabajos.
  • Señal de error de funcionamiento: se usa para informar errores del sistema operacional.
  • Señales misceláneas: Señales misceláneas.
  • mensajes de señal: Impresión de un mensaje que describe una señal

Puede obtener más información en profundidad sobre este here. Se afirma lo siguiente, que supongo que es lo que busca:

Si usted anticipa un evento que hace que las señales, se puede definir una función de controlador y decirle al sistema operativo para ejecutar cuando ese tipo particular de la señal llega.

+0

Gracias por la pista. ¿Conoce algún código de ejemplo que use señales para el manejo de la expiación? – stefangachter

+0

Hay códigos de muestra si lees el enlace en mi publicación. –

1

Offtopic probablemente, pero no puedo resistirlo, lo siento.

Debo decir que el único mecanismo de excepciones realmente bueno y completo que he visto hasta ahora es el manejo de excepciones estructuradas de SEH en Windows.

Sopla el modelo de manejo de excepciones C++ (que levanta las manos cuando se lanza una excepción dentro del destructor de un objeto automático durante el desenrollado de la pila).

Además, se trata de un manejo de excepciones realmente uniforme, ya que combina las excepciones del software y las generadas por el hardware.

De modo que si desea manejar excepciones, escriba para Windows o implemente algo similar para Linux.

P.S.A diferencia de lo que mucha gente piensa, el manejo de excepciones es muy lejos más que simplemente interrumpir el flujo normal del programa usando jmp.

También es una cadena de negociaciones sobre quién y cómo maneja la excepción. Es (lo más importante) - la correcta limpieza ejecución en cada ámbito, se trata de excepciones anidadas y etc

1

puedo sugerir que eche un vistazo a mi biblioteca exceptions4c? Ha sido probado en Linux y tiene muchas características, como bloques finally, manejo de señal y un tipo de polimorfismo que le permite crear jerarquías de excepción. También es compatible con multi-threading.