Ich stieß auf ein interessantes Szenario mit Flusskontrolle während der Arbeit an meiner Sprache. Was passiert, wenn während der Verarbeitung einer break
-Anweisung eine Ausnahme ausgelöst wird? GCC scheint zu glauben, dass der Break-Flow verloren ist, aber der Standard scheint etwas still darüber zu sein, was passieren sollte.Soll break/continue/return von einer Ausnahme unterbrochen werden?
Zum Beispiel, was sollte das folgende Programm tatsächlich tun?
#include <iostream>
using namespace std;
struct maybe_fail {
bool fail;
~maybe_fail() {
if(fail)
throw 1;
}
};
int main() {
for(int i=0; i < 6; ++i) {
cout << "Loop: " << i << endl;
try {
maybe_fail mf;
mf.fail = i % 2;
if(i == 3)
break;
} catch(int) {
cout << "Caught" << endl;
}
}
return 0;
}
Beachten Sie, dass ein return
auch blockiert werden, ebenso wie ein continue
(fügt Ausgang nach dem Fang, das zu sehen). Versuch, goto
außerhalb des Blocks wird auch gefangen werden.
Was ist der richtige Durchfluss? Der Standard scheint dies nicht zu berücksichtigen: Abschnitt 6.6 zu Sprunganweisungen erwähnt nichts und auch Abschnitt 15 zur Ausnahmebehandlung nicht. Ich verstehe, dass Ausnahmen in Destruktoren in schrecklich schlechter Form sind, aber wenn Sie etwas wie BOOST_SCOPE_EXIT für Defer-Anweisungen verwenden, könnte dieses Verhalten sehr wichtig werden.
Vielleicht ist der gleiche Ablauf in Java und Python von Interesse, so scheint zumindest eine gewisse Konsistenz in den Imperativsprachen zu bestehen.
Ihre Frage scheint den Rat in den C++ - FAQ zu rechtfertigen: http://www.parashift.com/c++faq-lite/dtors-shouldnt-throw.html Grundsätzlich, werfen Sie keine Ausnahmen in Destruktoren. Diese Frage in den FAQ lautete, wie 'terminate()' aufgerufen wird, wenn Sie sich in einer "double-exception-handling" -Situation befinden, aber Ihr Beispiel scheint den Ratschlag fortzusetzen, dass es einfach schlecht ist. –
@Kevin, dieser Rat würde sich dann auf jede "verzögernde" Anweisung in jeder Sprache erstrecken (einschließlich BOOST_SCOPE_EXIT für C++). –
Wie sonst würden Sie das Verhalten interpretieren? wirf die Ausnahme in den Destruktor, und was dann? – bdwain