Throw mit string



  • Ich habe gelesen das man kein stdString werfen sollte, besonders nicht bei std::bad_alloc. Die Alternative ist natürlich ein C-String, aber wie bekomme ich am besten verschiedene Variablen zu einen C-String?

    if (status_code != 200)  //mein Versuch ist leider sehr unleserlich
    {
        throw std::runtime_error( std::string( std::string("bad status code ") + std::to_string( status_code ) ).c_str() );
    }
    


  • DontThrowAStdString schrieb:

    Ich habe gelesen das man kein stdString werfen sollte, besonders nicht bei std::bad_alloc.

    Ignoriere std::bad_alloc. In dem Fall kannst du eh nichts machen. Mach es so, wie du gezeigt hast, aber bedenke, dass Exceptions sehr gerne überbenutzt werden.



  • Ups, so wie du es gemacht hast, solltest du es besser nicht machen (c_str() ist nicht mehr gültig, sobald das return beendet ist). Mach dir deine eigene Exception-Klasse.



  • bad_excep schrieb:

    Ups, so wie du es gemacht hast, solltest du es besser nicht machen (c_str() ist nicht mehr gültig, sobald das return beendet ist). Mach dir deine eigene Exception-Klasse.

    Danke für die Hilfe! Meinst du damit eine Exception-Klasse die stdString erwartet?


  • Mod

    Was genau ist deine Frage? Wofür benötigst du das? Der gezeigte Code von dir ist einwandfrei (obwohl der Cast nach std::string natürlich nicht nötig ist, die Klammern allein reichen).



  • bad_excep schrieb:

    DontThrowAStdString schrieb:

    Ich habe gelesen das man kein stdString werfen sollte, besonders nicht bei std::bad_alloc.

    Ignoriere std::bad_alloc. In dem Fall kannst du eh nichts machen. Mach es so, wie du gezeigt hast, aber bedenke, dass Exceptions sehr gerne überbenutzt werden.

    Ignorieren? Was spricht denn dagegen einen std::runtime_error mit einem Stringliteral als Argument zu werfen?



  • Wenn du sowieso schon nen std::string hast, dann verwende auch den std::string const& ctor:

    if (status_code != 200)  //mein Versuch ist leider sehr unleserlich 
    { 
    //   throw std::runtime_error( std::string( std::string("bad status code ") + std::to_string( status_code ) ).c_str() ); 
         throw std::runtime_error("bad status code " + std::to_string(status_code)); 
    }
    


  • Der Grund dafür, dass man bei std::bad_alloc keinen std::string werfen soll ist der, dass std::string selbst noch ein mal Speicher im Freespace für seinen internen Puffer anfordert. Im Falle von std::bad_alloc kann das auch in die Hose gehen, weil Speicher gerade knapp ist.
    Ich kann gerade nicht sagen, wie die anderen Exception Klassen der STL das handhaben, also ob hinter what() ein std::string steckt oder nur ein Zeiger.


Log in to reply