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::stringnatü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_errormit einem Stringliteral als Argument zu werfen?
-
Wenn du sowieso schon nen
std::stringhast, 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_allockeinenstd::stringwerfen soll ist der, dassstd::stringselbst noch ein mal Speicher im Freespace für seinen internen Puffer anfordert. Im Falle vonstd::bad_allockann 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::stringsteckt oder nur ein Zeiger.