Soll break / continue / return von einer Exception unterbrochen werden?

9

Ich stieß auf ein interessantes Szenario mit Flusskontrolle, während ich an meiner Sprache arbeitete. 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.

Was sollte zum Beispiel das folgende Programm eigentlich tun?

%Vor%

Beachten Sie, dass eine return ebenfalls blockiert wird, ebenso wie eine continue (fügen Sie die Ausgabe nach dem Catch hinzu, um das zu sehen). Der Versuch, goto außerhalb des Blocks zu setzen, wird ebenfalls abgefangen.

Was ist der richtige Fluss? 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 ziemlich wichtig werden.

Vielleicht ist der gleiche Ablauf in Java und Python der Fall, daher scheint zumindest eine gewisse Konsistenz in den Imperativsprachen zu bestehen.

    
edA-qa mort-ora-y 19.04.2013, 04:01
quelle

2 Antworten

4

Dies wird in 15.1 behandelt. Auslösen einer Ausnahme:

  

2 Wenn eine Ausnahme ausgelöst wird, wird die Kontrolle an den nächstgelegenen Handler mit einem passenden Typ übergeben (15.3);   "Nearest" bedeutet den Handler, für den die zusammengesetzte Anweisung oder der ctor-Initialisierer dem try-Schlüsselwort folgt   wurde zuletzt vom Steuerungs-Thread eingetragen und noch nicht verlassen.

Sobald die Steuerung an den Ausnahmebehandler übergeben wurde, wird sie von dort fortgesetzt. Es gibt keinen Mechanismus zum "Erinnern", dass der Code in der Mitte von break war und dann irgendwie fortgesetzt wird, nachdem die Ausnahme behandelt wurde.

    
NPE 19.04.2013 04:10
quelle
0

Angesichts der spezifischen Formulierung im Stadnad, werde ich sagen, dass es mehrdeutig ist. Der Text reicht nicht aus, um die beabsichtigten Ströme dieser Situationen zu identifizieren. Es ist durchaus möglich, dass die Konvention, die wir jetzt haben, nur zufällig ist, weil Compiler geschrieben werden.

Siehe mein Blog-Thema Wie man eine "Return" -Anweisung abfängt / a>.

    
edA-qa mort-ora-y 09.05.2013 10:22
quelle

Tags und Links