Estoy escribiendo un software reactivo, que recibe repetidamente la entrada, la procesa y emite resultados relevantes. El bucle principal se ve algo como:Alternativa a C++ excepción
initialize();
while (true) {
Message msg,out;
recieve(msg);
process(msg,out);
//no global state is saved between loop iterations!
send(out);
}
Quiero que todo lo que ha producido un error durante la fase de proceso de alta whetehr es error de falta de memoria, error lógico, la afirmación no es válida, etc, el programa va a limpiar lo que hizo, y sigue corriendo. Asumiré que es una entrada inválida, y simplemente lo ignoraré.
La excepción de C++ es excepcionalmente buena para esa situación, podría rodear process
con la cláusula try/catch
, y lanzar una excepción cada vez que algo vaya wrog. Lo único que necesito para asegurarme de limpiar todos mis recursos antes de lanzar una excepción. Esto podría ser verificado por RAII, o escribiendo un asignador de recursos global (por ejemplo, si su destructor podría arrojar una excepción), y utilícelo exclusivamente para todos los recursos.
Socket s = GlobalResourceHandler.manageSocket(new Socket());
...
try {
process(msg,out);
catch (...) {
GlobalResourceHandler.cleanUp();
}
Sin embargo, el uso de excepción está prohibido en nuestro estándar de codificación (también en Google's C++ standard por cierto), como resultado de todo el código se compila con excepciones fuera, y creo que nadie va a cambiar la manera de trabajar todo sólo por mi problema de diseño.
Además, este es el código de la plataforma integrada, por lo que cuanto menor sea la función extra de C++ que usemos, más rápido se vuelve el código, y más portátil es.
¿Existe un diseño alternativo que pueda considerar?
actualización: agradezco la respuesta de everyones sobre el código idiota estándar. Lo único que puedo decir es que, en las grandes organizaciones, debes tener reglas estrictas y, a veces, ilógicas, para asegurarte de que ningún idiota vendrá y no podrá mantener tu buen código. El estándar es más sobre las personas que sobre tecnicismos. Sí, el hombre malo puede hacer que cada código sea un desastre, pero es mucho peor si le das herramientas adicionales para la tarea.
Todavía estoy buscando un técnico respuesta.
¿Podrían presentar referencia a la norma ++ C del Google que prohíbe excepciones? –
La forma correcta de hacerlo con excepciones no es a través del asignador global, sino con el uso de objetos RAII (http://en.wikipedia.org/wiki/Resource_Acquisition_Is_Initialization). –
@Pavel: triste pero cierto, http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Exceptions –