2016-04-20 3 views
6

Mein Chef beantwortete diese Frage why ... (three points) in catch block is exist? ziemlich elegant.Ist ein Wurf in Fang (...) werfen nach Wert oder per Referenz

Aber es hat mich an etwas denke gemacht (und hoffentlich macht für meine frühere schlechte Frage nach oben), hat

catch(...){ 
    throw; 
} 

rethrow die abgefangene Ausnahme von Wert (dh eine tiefe Kopie genommen wird) oder durch Referenz?

+3

_Das erneut geworfene Ausnahme-Objekt ist das ursprüngliche Ausnahme-Objekt, keine Kopie._ Aus den Bemerkungen in [try, throw and catch-Anweisungen] (https://msdn.microsoft.com/en-GB/library/) 6dekhbbc.aspx). Also davon ausgehend nehme ich per Referenz an? –

+0

Mögliches Duplikat von [machen die standardmäßigen Catch-throw-Anweisungen in C++ nach Wert oder Verweis] (http://stackoverflow.com/questions/9562053/do-the-default-catch-throw-statements-in-c-pass-) by-value-or-reference) –

Antwort

9

Der Standard sagt:

Ein Wurf-Ausdruck ohne Operanden rethrows die aktuell behandelte Ausnahme. Die Ausnahme wird mit dem vorhandenen temporären reaktiviert; Es wird kein neues temporäres Ausnahmeobjekt erstellt.

- ISO/IEC 14882: 2011 Abschnitt 15.1 par. 8

Mit anderen Worten, es wird einfach die Ausnahme Propagierung mit dem ursprünglichen Ausnahmeobjekt fortgesetzt. Ich nehme an, das ist analog zu dem, was Sie mit "durch Bezugnahme" meinen.

+1

Der Ort hat sich in späteren Entwürfen §5.17/3 geändert, aber der Wortlaut und die Absicht bleiben; [Siehe hier für einen Link] (http://eel.is/c++draft/expr.throw#3). Und dieses Zitat * "Wenn ein Handler durch erneutes Auswerfen beendet wird, wird die Kontrolle an einen anderen Handler für dieselbe Ausnahme übergeben." * Von [hier] (http://eel.is/c++draft/except#except.throw-4). – Niall

Verwandte Themen