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?
-
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 denstd::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
keinenstd::string
werfen soll ist der, dassstd::string
selbst noch ein mal Speicher im Freespace für seinen internen Puffer anfordert. Im Falle vonstd::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 hinterwhat()
einstd::string
steckt oder nur ein Zeiger.