Von std::exception erben (Stilfrage)



  • naja es heisst die klasse steht für ausnahmen, die vom c++ host environment geworfen werden^^

    und überhaupt mach ich dieses const char *what() const gar nicht. überall im programm hab ich hier wstring oder zumindest wchar_t..



  • Letztlich steht die Klasse für alle Exceptions, die irgendwo auftreten können - und wenn deine eigenen Fehler vergleichbar mit Standardfehlern behandelt werden sollen, spricht nichts dagegen, sie in diese Hierarchie einzubinden.

    (wobei - wenn du überall mit wstring's arbeitest, kannst du mit den Standard-Excetions auch nicht viel anfangen - behandeln mußt du sie trotzdem)



  • Vorsicht: In der Exception macht es schon Sinn, char const* zu verwenden. Denn wenn eine Exception geworfen wird, weil der Speicher aufgeht, macht es nicht immer Sinn zu versuchen Speicher für einen String zu allokieren.



  • Ja, std::string in der exception-klasse ist nicht so schlau, weil ein std::string-Objekt auch eine Exception werfen kann. Und das würde eine Endloskettenreaktion verursachen, sollte der Fall eintreten.



  • Artchi schrieb:

    Und das würde eine Endloskettenreaktion verursachen, sollte der Fall eintreten.

    Wenn eine Exception geworfen wird und ohne das diese gefangen wurde wieder eine neue Exception irgendwo geworfen wird, wuerde terminate() aufgerufen werden, was das Programm (standardmaessig) beendet - IIRC.



  • Artchi schrieb:

    Ja, std::string in der exception-klasse ist nicht so schlau, weil ein std::string-Objekt auch eine Exception werfen kann. Und das würde eine Endloskettenreaktion verursachen, sollte der Fall eintreten.

    aber dann kann man ja gar keine vernünftige zusatzinformationen in der exception klasse ablegen, weil die meisten informationen bzw. deren verwendung selbst auch exceptions werden könnte 😕



  • Naja, man kann schon einiges machen.

    class my_exception : public std::exception
    {
    public:
        my_exception(std::string const& s)
        {
            try
            {
                m_my_string = new std::string(s);
            }
            catch (...)
            {
            }
        }
    
        char const* what() const
        {
            if (m_my_string)
                return m_my_string->c_str();
            else
                return "The error message could not be stored.";
        }
    
    private:
        boost::shared_ptr<std::string const> m_my_string;
    };
    

    Das Beispiel zeigt jetzt nur wie man einen einfachen String kopiert, aber auch andere "Zusatzinformationen" kann man so schön in die Exception mit reinpacken.



  • Wenn du sowieso schon ableitest, kannst du das ganze doch noch um wstring methoden erweitern. Also "wwhat" 😉



  • Mr. Iks schrieb:

    Wenn du sowieso schon ableitest, kannst du das ganze doch noch um wstring methoden erweitern. Also "wwhat" 😉

    wie denn jetzt? const wstring &wwhat() const oder doch const wchar_t *wwhat() const?



  • dann wohl eher letzteres, da der wstring ja selbst nicht exception save ist.



  • Mr. Iks schrieb:

    Wenn du sowieso schon ableitest, kannst du das ganze doch noch um wstring methoden erweitern. Also "wwhat" 😉

    Wobei du hiermit Probleme bekommst, wenn du deine Exceptions und die Standard-Exceptions gemeinsam verwenden willst - std::exception hat keine wwhat() und die davon abgeleiteten Klassen stellen auch keine UNICODE-Fehlermeldungen bereit.


Anmelden zum Antworten