tiro voluntad C ++ sin argumentos trabajo dentro de otro cuadro para volver a lanzar una excepción?
Pregunta
Si tengo un código como el siguiente:
try {
doSomething();
} catch (...) {
noteError();
}
void noteError() {
try {
throw;
} catch (std::exception &err) {
std::cerr << "Note known error here: " << err.what();
} catch (...) {
std::cerr << "Note unknown error here.";
}
throw;
}
¿Las excepciones son arrojados originales de ambos lugares dentro del marco inferior de noteError ()?
Solución
La redacción en la norma (§15.1 / 2) es de (énfasis mío):
Cuando se produce una excepción, el control se transfiere a la manejador más cercano con un tipo de juego (15.3); medios “más cercano” al controlador para que el compuesto enunciado, Héctor-inicializador, o una función corporal tras la palabra clave try se ha introducido más recientemente por el hilo de control y no todavía salido.
Cuando haya un bloque try "salido"? De acuerdo con la gramática (§ 15/1), bloques try terminan con un secuencia de los manipuladores, así que los extremos de bloque cuando los extremos último manipulador. En otras palabras:
try // <- start of try block
{
}
catch (whatever) // <- first handler
{
}
// ... more handlers
catch (whatever_again) // <- last handler
{
} // <- end of try block
Así que sí, el código está bien. Cuando re-lanzado, el bloque try más cercana tiene un controlador de juego (es decir, catch (...)
), por lo que se introduce manejador.
Otros consejos
Su código original estaba bien. Atrapaste diferentes tipos de excepción y llamó a una función que ingrese un mensaje y volver a lanzar. La declaración throw
no está obligado a aparecer directamente en el interior del bloque de catch
correspondiente. Si se llama a una de esas funciones "nota" y ya está no manejo actualmente una excepción, sin embargo, a continuación, el programa va a llamar terminate()
.
El nuevo código también está bien. Está bien que captura todo y luego llamar a otra función que relanzamientos para ir a un controlador más específico. Eso es el excepción despachador describe en lenguaje el C ++ FAQ . Se ve un poco peculiar de volver a lanzar la excepción después bloque despachar ha terminado, pero si había ocurrido ese mismo comunicado throw
después noteError
devuelto (dentro del bloque catch
el original) en lugar de donde está ahora, entonces sería perfectamente normal; se demostró en la norma, §15.1 / 6.