He cambiado un poco el título porque pensé que esta era la pregunta más adecuada.C++, ¿está justificada esta declaración goto?
¿Lo refactorizaría (parece uso legítimo de goto)? Si, ¿cómo podría refactorizar el siguiente código para eliminar ir a la declaración?
if (data.device) {
try {
...
}
catch(const std::exception&) { goto done; }
... // more things which should not be caught
done: ;
}
declaración completa
#ifdef HAVE_GPU
// attempt to use GPU device
if (data.device) {
try {
Integral::Gpu eri(S, R, Q, block.shell());
eri(basis.centers(), quartets, data.device);
}
// if GPU fails, propagate to cpu
catch(std::exception) { goto done; }
data.device += size;
host_index.extend(block_index);
block_index.data.clear();
done: ;
}
#endif
agradecimiento
después de haber visto la preferencia de la mayoría, me decidí a ir con la bandera, pero con la observación del Sr. York.
Gracias a todos
Es difícil de decir sin ver lo que hay en los bloques, pero otra posibilidad es mover el código dentro de la función if a. (Puede mejorar la legibilidad también, tal vez no). Luego puede regresar temprano si algo malo sucedió. – GManNickG
Catch by const reference, please. –
@GMan agregó una declaración completa. La función puede ser exagerada, ya que no hay cierre. – Anycorn