Was macht ein single "throw;" - Anweisung zu tun?
Diese Tage, ich habe viel gelesen das C++ - F. A. Q und vor allem auf dieser Seite.
Lesen Sie den Abschnitt entdeckte ich eine "Technik", die der Autor fordert, "exception dispatcher", die erlaubt, dass jemand alle seine exception handling in einer praktischen Funktion:
void handleException()
{
try {
throw; //?!
}
catch (MyException& e) {
//...code to handle MyException...
}
catch (YourException& e) {
//...code to handle YourException...
}
}
void f()
{
try {
//...something that might throw...
}
catch (...) {
handleException();
}
}
Was mich stört ist das einzige throw;
Aussage: wenn man bedenkt das gegebene Beispiel dann sicher, ist es offensichtlich, was es tut: es rethrows die exception gefangen in f()
ist und sich mit es wieder.
Aber was ist, wenn ich Anruf handleException()
auf seine eigene, direkt, ohne es von einem catch()
- Klausel ? Gibt es eine spezifizierte Verhalten ?
Zusätzlich für bonus-Punkte, gibt es noch andere "verrückte" (wahrscheinlich nicht das gute Wort) Verwendung von throw
, die Sie kennen ?
Danke.
- Hast du gelesen das auf deiner verlinkten Seite? parashift.com/c++-faq-lite/Ausnahmen.html#faq-17.15 'In diesem Beispiel wird die Anweisung
throw;
bedeutet "re-werfen Sie die aktuelle exception."' - Larson: Absolut. Aber in dem Fall, wo es keine "aktuellen" Ausnahme, was passiert ?
- Ich fand die Antwort, aber @dalle, mich zu schlagen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie eine
throw;
auf seine eigene, und es gibt nicht eine aktuelle Ausnahme für es zu rethrow, dann wird das Programm endet abrupt. (Genauer gesagt, eineterminate()
genannt wird.)Beachten Sie, dass zu werfen; ist der einzige sichere Weg, um wieder werfen Sie die aktuelle exception - es ist nicht äquivalent zu
catch (exception const & e) { throw e; }
throw;
wird, bewahren Sie die original-exception-Typ, währendthrow e;
möglicherweise Scheibe.throw e;
wirft eine neue exception mit dem statischen Typ von e, nicht der dynamische Typ - so kann er Scheibe, wenn e ist polymorph.std::exception
, richtig?std::exception
.Ja, es spezifiziert das Verhalten, es wird Anruf beenden;
Dass die so genannte exception-handler. Es rethrows die "aktuelle Ausnahme", wenn überhaupt. Wenn es keine Ausnahme derzeit behandelt
terminate()
aufgerufen werden.