¿Cómo implemento excepciones con la instrucción anidable try-catch-finally con mensajes en C

Estoy buscando implementar excepciones con la statement de prueba-captura-final anidable con mensajes en C usando longjmp / setjmp.

He logrado implementar excepciones try-catch-else, no son anidables. También espero agregar mensajes a las excepciones. ¿Alguna idea de cómo podría ser capaz de hacerlo?

Dave Hanson ya ha hecho un muy buen paquete de macros de excepción como parte de su excelente libro C Interfaces e Implementaciones . Puedes usar el código al por mayor o aprender de sus técnicas. Para cualquier persona que haga una buena cantidad de progtwigción en C, vale la pena comprar el libro: cambiará la forma en que cambia la progtwigción en C y le mostrará cómo hacer un diseño orientado a objetos en C.

Para anidar: un marco de stack de bloques try / catch actuales.

Su bash utilizará setjmp para guardar en un jmpbuffer (supongo). Si ha hecho un bash y, por lo tanto, ahora está en el ámbito de un bloque de bash y tiene otro bash, entonces desea conservar el jmpbuffer existente y también crear uno nuevo – Empujar – y cuando lo atrapa, está intentando volver a el punto del bash más reciente por lo tanto, Pop el último jmpbuffer. Así que creo que un modelo similar a una stack tiene sentido para el bash / captura nested.

Para la implementación, supongo que el apporach más simple es reservar una serie de jmpbuffers, por lo tanto, limitar su profundidad de captura de prueba, pero mantenerlo simple; Push and Pop solo requiere que rastree el índice en esa matriz.

Para mensajes y otros contenidos de excepción, un área reservada para “currentException”.

Contenido de excepción. Mantenlo simple, define una estructura de excepción. Una matriz de caracteres y un int. Manteniéndolo simple, pero no demasiado simple, reserve una serie de ellos para que pueda admitir el encadenamiento.

Para un tiro permites

throw ( "string", errcode ) 

Que simplemente pone a cero la estructura de la matriz y hace una entrada. Y

  catch ( exception ) 

Ahora puede mirar en la matriz y encuentra la primera entrada, y luego

  throwChain ( "string", errcode) 

Lo que agrega la nueva excepción a la matriz (si hay espacio, y si no, puede mezclar la matriz de acuerdo con alguna regla como FIFO)

Pero, tengo que preguntar, ¿por qué no usar C ++?

Bueno, realmente no puede implementar excepciones en C ya que no están soportadas por el lenguaje. Lo mejor que puedes hacer es emularlos usando setjmp y longjmp y algunas macros diabólicamente inteligentes.

Una búsqueda rápida muestra estos enlaces que pueden ser útiles para usted:

  • Excepciones en C
  • Manejo de excepciones con longjmp ()