Exceptions // Call Trace
-
Hallo,
ich habe folgendes problem :
es geht um exceptions und um das "Weiterwerfen" der selbigenIch schreibe gerade eine Speicherroutine für eine Datenstruktur
aus meinem Programm, diese Struktur besteht wieder aus Strukturen.Nun wollte ich das Speichern natürlich kapseln, und habe somit
für jeder "Unterklassen" die operatoren << und >> überschrieben,
realisiert habe ich das über die methoden :void printAt(std::ostream& stream=std::cout);und
void fromInstream(std::istream& stream) // throws ParseErrorExceptionwenn nun beim parsen ein Fehler auftritt werfe ich oben genannte
ParseErrorException, mit den Unterklassen sieht das dann so ausvoid ObersteStruktur::fromInStream(stream) { try { m_unterstruktur.fromInStream(stream); } catch(ParseErrorException& e) { throw e; } }lässt sich so ein Call-Trace aufstellen? Um dann herrauszufinden,
Bei wem und Wo das parsen fehlschlug?
-
Das kannst du schon so machen. Wenn du aber, wie in deinem Beispiel, im catch-Zweig nichts weiter machst, brauchst du die Exception dort eigentlich auch nicht zu fangen. Das macht nur Sinn wenn du da irgendwelche Aufräumaktionen starten oder weitere Informationen der Exception zufügen willst.
-
sollte es nicht beim weiterwerfen so aussehen?
catch(exception &e) { throw; }
-
Braunstein schrieb:
Das kannst du schon so machen. Wenn du aber, wie in deinem Beispiel, im catch-Zweig nichts weiter machst, brauchst du die Exception dort eigentlich auch nicht zu fangen. Das macht nur Sinn wenn du da irgendwelche Aufräumaktionen starten oder weitere Informationen der Exception zufügen willst.
naja das catchen würde dann wohl so aussehen
catch(ParseErrorException& e) { e.addCaller(this); throw; }wobei "this" natürlich exemplarisch zu sehen ist. Mal sehen welche Info ich da
reinpacke.
Auf jeden Fall werde ich das auf diese Art mal probieren.
Mal sehen wie "anwendbar" und "praktisch" so ein vorgehen ist...
-
Je nach Betriebssystem stehen dir andere Mittel zur Verfügung, um den Calltrace zum Zeitpunkt des Werfens einer Exception herauszufinden.
Die glibc kennt zum Beispiel die folgende Funktion:
int backtrace (void **buffer, int size)