C ++ Ausnahmen Fragen auf rethrow der ursprünglichen Ausnahme
Frage
Wird die folgende append () in dem Fang Ursache der erneut ausgelöst Ausnahme die Wirkung von append zu sehen () aufgerufen wird?
try {
mayThrowMyErr();
} catch (myErr &err) {
err.append("Add to my message here");
throw; // Does the rethrow exception reflect the call to append()?
}
Und falls ich es auf diese Weise umschreiben, Willen Bit-Slice auftreten, wenn die tatsächliche Ausnahme von Myerr abgeleitet ist?
try {
mayThrowObjectDerivedFromMyErr();
} catch (myErr &err) {
err.append("Add to my message's base class here");
throw err; // Do I lose the derived class exception and only get myErr?
}
Lösung
Andere Tipps
Diese Frage ist ziemlich alt und hat eine Antwort entsprechend der Zeit, es wurde gefragt. Allerdings mag ich nur eine Notiz auf hinzuzufügen, wie richtige Ausnahmebehandlung zu tun, da C ++ 11 und ich glaube, dies entspricht sehr gut zu dem, was Sie versuchen, mit dem Anfügen Funktion zu erreichen:
Verwenden Sie std::nested_exception
und std::throw_with_nested
Es wird auf Stackoverflow beschrieben hier und hier , wie können Sie einen Backtrace auf Ausnahmen für einen Debugger, ohne dass in Ihrem Code oder umständliche Protokollierung, indem Sie einfach einen richtigen Exception-Handler schreiben, die verschachtelten Ausnahmen erneut auslösen wird .
Da Sie dies mit jeder abgeleitete Exception-Klasse tun können, können Sie eine Vielzahl von Informationen zu einem solchen Backtrace hinzuzufügen! Sie können auch einen Blick auf meine MWE auf GitHub , wo ein Backtrace etwas aussehen würde, folgt aus:
Library API: Exception caught in function 'api_function'
Backtrace:
~/Git/mwe-cpp-exception/src/detail/Library.cpp:17 : library_function failed
~/Git/mwe-cpp-exception/src/detail/Library.cpp:13 : could not open file "nonexistent.txt"
Ja, Erneutes Auslösen von rethrows die ursprüngliche Ausnahme-Objekt, das Sie durch einen Verweis geändert haben. Sie können auch eine Basisklasse Referenz fangen, indem sie sie ändern und noch in der Lage sein, den ursprünglichen abgeleiteten Ausnahmetyp von throw;
erneut auslösen.
für die erste Frage, ja.
aber für die zweite, beziehen sich auf Vlad Antwort. müssen Sie sorgfältig Ihre Aufgabe Ausnahme Griff Kopie Ctor entwerfen. Vereinbarungsgemäß ist Basisklasse nicht ihr Kind erkennen, so dass Sie werden höchstwahrscheinlich die zusätzlichen Daten, die von abgeleiteten Klasse durch verlieren.