Exceptions // Call Trace



  • Hallo,

    ich habe folgendes problem :
    es geht um exceptions und um das "Weiterwerfen" der selbigen

    Ich 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 ParseErrorException
    

    wenn nun beim parsen ein Fehler auftritt werfe ich oben genannte
    ParseErrorException, mit den Unterklassen sieht das dann so aus

    void 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)
    

Anmelden zum Antworten