tiro voluntad C ++ sin argumentos trabajo dentro de otro cuadro para volver a lanzar una excepción?

StackOverflow https://stackoverflow.com/questions/3561571

  •  01-10-2019
  •  | 
  •  

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 ()?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top