stringstream und c_str()



  • Nein, du kannst höchstens den string als Member der Exceptionklasse nehmen. Was man aber vermeiden sollte, wenn die Speicherallokation fehlschlägt, dann kracht es bei der Behandlung der Exception.

    Warscheinlich bin ich der Einzige, der es so machen würde, aber so finde ich es am Besten:

    1. Verpasse der Excpetionklasse einen Buffer mit statischer Größe, zb 4096.
    2. Schreibe mit ssprintf in den Buffer.



  • Ethon schrieb:

    Was man aber vermeiden sollte, wenn die Speicherallokation fehlschlägt, dann kracht es bei der Behandlung der Exception.

    Die wenigsten Exceptions fliegen, weil es keinen Speicher mehr gibt. Entsprechend unangebracht finde ich die Verkomplizierung sämtlicher Exception-Implementierungen.

    std::runtime_error wird beispielsweise auch von einem std::string konstruiert.



  • Im übrigen würde ich std::ostringstream statt std::stringstream verwenden. Du willst ja nichts aus dem String lesen.



  • Wenn ich jetzt eine neue Membervariable mache:

    protected:
       std::string msg;
    

    Sagt der Compiler hierzu nein:

    std::ostringstream  ss;
    
    	ss << "Exception: " << error_msg << " - Errorcode: " << error_code;
    	msg = ss.str();
    
    	return msg.c_str();
    }
    

    Binärer Operator '=': Es konnte kein Operator gefunden werden, der einen linksseitigen Operanden vom Typ 'const std::string' akzeptiert (oder keine geeignete Konvertierung möglich)

    Wieso wandelt der meinen string in einen const string um?



  • #include <string> drin?



  • Ja, <string> wird bei <sstream> mit eingebunden.



  • [cpp]what() const[/cpp]



  • knuffimaus schrieb:

    Ja, <string> wird bei <sstream> mit eingebunden.

    Drauf würde ich mich nicht verlassen. Ev. wird std::string auch nur Vorwärtsdeklariert. Ausserdem, was passiert, wenn Du beschliesst nicht mehr std::ostringstream sondern boost::format zur Formatierung deines Strings zu benutzen (dann löschst Du #include <sstream> und fügst #include <boost/format.hpp> hinzu...)?



  • Warum setzt du den Stream in what() zusammen? what() ist nur ein Getter für die Fehlermeldung, deswegen ist die Methode auch const -qualifiziert.



  • Nexus schrieb:

    Warum setzt du den Stream in what() zusammen? what() ist nur ein Getter für die Fehlermeldung, deswegen ist die Methode auch const -qualifiziert.

    Das wäre im Prinzip gar keine schlechte Idee. Die Formatierung benötigt Zeit und wenn ich an einer eventuell performancekritischen stelle eine exception auffangen will, der Text mich aber nicht interessiert, dann wird die Formatierung erst gar nicht ausgeführt.

    Es ist natürlich nicht ganz trivial, es richtig zu implementieren, aber machbar. Man könnte beispielsweise ein mutable std::string als Member vor sehen, in den man die Fehlermeldung formatiert, wenn what aufgerufen wird.



  • tntnet schrieb:

    Die Formatierung benötigt Zeit und wenn ich an einer eventuell performancekritischen stelle eine exception auffangen will, der Text mich aber nicht interessiert, dann wird die Formatierung erst gar nicht ausgeführt.

    Da fängt man aber keine Ausnahmen auf, weil das eben Ausnahmen sind. Die sind auch ohne Nachricht langsam.



  • TyRoXx schrieb:

    Die sind auch ohne Nachricht langsam.

    Ist das im Standard so spezifiziert? Ich würde das nicht so verallgemeinern. Es gibt auch Situationen, da möchte ich schnell auf eine Ausnahme reagieren.



  • tntnet schrieb:

    TyRoXx schrieb:

    Die sind auch ohne Nachricht langsam.

    Ist das im Standard so spezifiziert? Ich würde das nicht so verallgemeinern. Es gibt auch Situationen, da möchte ich schnell auf eine Ausnahme reagieren.

    Ist doch egal was vom Standard spezifiziert ist.
    Klar steht da nicht drin "Exceptions haben langsam zu sein".
    Es gibt halt Systeme auf denen sind sie langsam, und damit sollte man sich abfinden. Und seine Programme darauf auslegen.
    Weil sie sonst halt nicht gut funktionieren werden.


Anmelden zum Antworten