Will C ++ Wurf ohne Argumente Arbeit in einem anderen Rahmen, der eine Ausnahme erneut auslösen?

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

  •  01-10-2019
  •  | 
  •  

Frage

Wenn ich einen Code wie folgt aus:

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;
}

Werden die ursprünglichen Ausnahmen von beiden Orten innerhalb des unteren Rahmens von noteError geworfen get ()?

War es hilfreich?

Lösung

Die Formulierung in der Norm (§ 15.1 / 2) (Hervorhebung von mir):

  

Wenn eine Ausnahme ausgelöst wird, die Steuerung an der übertragen wird nächsten Handler mit einem passenden Typ (15.3); „Nearest“ bedeutet die Prozedur, für die die Verbindung-Anweisung, Ctor-Initialisierer oder Funktionskörper nach dem Schlüsselwort try wurde zuletzt durch das Gewinde der Steuerung eingegeben und noch nicht verlassen hat.

Wenn hat einen Try-Block "verlassen"? Gemäß der Grammatik (§15 / 1), try-Blöcke am Ende mit einem Sequenz von Handler, so dass die Blockenden, wenn die letzten Handler enden. Mit anderen Worten:

try // <- start of try block
{
}
catch (whatever) // <- first handler
{
}
// ... more handlers
catch (whatever_again) // <- last handler
{
} // <- end of try block

Also ja, ist der Code in Ordnung. Wenn wieder geworfen, der nächste try-Block einen passenden Handler hat (nämlich catch (...)), so dass Handler eingegeben wird.

Andere Tipps

Ihr Original-Code war in Ordnung. Sie gefangen verschiedene Ausnahmetypen und eine Funktion aufgerufen, die eine Meldung protokollieren würde und erneut auslösen. Die throw Aussage ist nicht direkt in dem entsprechenden catch Block erscheint erforderlich. Wenn Sie rufen Sie eine dieser „note“ Funktionen und du bist nicht zur Zeit eine Ausnahmebehandlung, obwohl, dann wird Ihr Programm terminate() nennen.

Ihr neuer Code ist auch in Ordnung. Es ist in Ordnung zu fangen alles und dann eine andere Funktion aufrufen, dass rethrows zu einer spezifischeren Handler zu gehen. Das ist die Ausnahme Dispatcher Idiom beschrieben in die C ++ FAQ . Es sieht ein wenig seltsam, die Ausnahme erneut auslösen nach der Dispatching-Block beendet ist, aber wenn die gleiche throw Aussage hatte nach noteError zurückgegeben (im Original catch Block) aufgetreten statt, wo es jetzt ist, ist es dann wäre stinknormale; es ist in der Norm gezeigt, § 15.1 / 6.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top