std::exception::what-Rückgabewert



  • Wenn ich von std::exception ableite und die what-Funktion überschreibe, ist es dann überhaupt richtig, sowas hier zu schreiben?

    const char *what()
    {
        return "Mein Fehler";
    }
    

    Weil wenn jetzt jemand im Quellcode das hier macht:

    catch (MeineException ex)
    {
        const char *message = ex.what();
    }
    

    dann wird der String ja nicht kopiert, sondern nur die Adresse übergeben. Aber die Adresse gehört ja zu einer lokalen Variable und kann somit nach dem Aufruf wieder ungültig sein. Sehe ich das richtig? Und wenn ja, wie ruft man dann in einer Funktion, die const char* zurückgibt, den Rückgabewert auf?


  • Administrator

    k schrieb:

    Sehe ich das richtig?

    Nein, siehst du nicht richtig. Was du zurück gibst ist keine lokale Variable, sondern ein Literal. Dieses ist während des ganzen Programmes gültig.

    Grüssli



  • catch (MeineException ex)
    

    Nebenbei: Ich würde Exceptions als Referenz fangen.



  • Mal eine andere Frage:

    Warum liefert what() eigentlich einen const char*
    und keinen const std::string&?
    Immerhin handelt es sich bei Exceptions ja um ein C++ Feature



  • C++ Exception schrieb:

    Mal eine andere Frage:

    Warum liefert what() eigentlich einen const char*
    und keinen const std::string&?
    Immerhin handelt es sich bei Exceptions ja um ein C++ Feature

    stell dir mal vor, bad_alloc würde erst noch speicherplatz für einen string beschaffen müssen...
    und solche fehlermeldungen sind ja im prinzip nichts, was erst zur laufzeit feststeht oder zusammengebastelt werden... (auch wenn letzteres doch viele machen)

    bb



  • Allerdings sind sie nicht ganz einheitlich beim Konstruktor.

    runtime_error::runtime_error(const std::string&);
    exception::exception(const char*);
    


  • Nexus schrieb:

    Allerdings sind sie nicht ganz einheitlich beim Konstruktor.

    runtime_error::runtime_error(const std::string&);
    exception::exception(const char*);
    

    finde ich aber nicht nur verständlich und nachvollziehbar sondern auch als durchaus bequem.
    ein runtime_error (wie der name schon sagt: er tritt erst zur laufzeit auf) kann imho zur compilezeit keinen wirklichen "betreff"(wie sagt man dazu eigtl^^) haben - dieser muss also zur runtime erst (unter Umständen) zusammengesetzt werden...

    bb



  • unskilled schrieb:

    C++ Exception schrieb:

    Mal eine andere Frage:

    Warum liefert what() eigentlich einen const char*
    und keinen const std::string&?
    Immerhin handelt es sich bei Exceptions ja um ein C++ Feature

    stell dir mal vor, bad_alloc würde erst noch speicherplatz für einen string beschaffen müssen...
    und solche fehlermeldungen sind ja im prinzip nichts, was erst zur laufzeit feststeht oder zusammengebastelt werden... (auch wenn letzteres doch viele machen)

    bb

    Ehrlich gesagt sehe ich das Problem nicht...
    Ein Exception-Objekt muss ja eh irgendwo erstellt werden.
    Wenn ich jetzt nen const std::string in das Objekt reinmache, ist das evtl. 4Byte(?)
    mehr, weil zu dem Zeiger noch eine Größe kommt.
    Oder wird der Inhalt des char array auch bei einem const std::string kopiert?



  • C++ Exception schrieb:

    Oder wird der Inhalt des char array auch bei einem const std::string kopiert?

    Wenn es der Compiler nicht wegoptimieren kann, dann schon.
    Ich würde auch mal behaupten wollen, dass der Durchschnitts-Compiler es nicht kann - da gab es imho mal ne Diskussion hier.

    bb


Anmelden zum Antworten