std::invalid_argument
| Definiert in der Header-Datei <stdexcept> |
||
| class invalid_argument; |
||
Definiert einen Typ von Objekt, der als Ausnahme geworfen wird. Er meldet Fehler, die entstehen, weil ein Argumentwert nicht akzeptiert wurde.
Diese Ausnahme wird von std::bitset::bitset und den Funktionen der Familie std::stoi und std::stof geworfen.
Vererbungdiagramm
Inhalt |
[bearbeiten] Member-Funktionen
| (Konstruktor) |
konstruiert ein neues invalid_argument-Objekt mit der angegebenen Nachricht(öffentliche Memberfunktion) |
| operator= |
weist das invalid_argument-Objekt zu(öffentliche Memberfunktion) |
std::invalid_argument::invalid_argument
| invalid_argument( const std::string& what_arg ); |
(1) | |
| invalid_argument( const char* what_arg ); |
(2) | |
| invalid_argument( const invalid_argument& other ); |
(3) | (noexcept seit C++11) |
std::invalid_argument haben, dann std::strcmp(what(), other.what()) == 0. Vom Kopierkonstruktor kann keine Ausnahme geworfen werden.Parameter
| what_arg | - | erklärende Zeichenkette |
| Sonstiges | - | ein anderes Ausnahmeobjekt zum Kopieren |
Ausnahmen
Anmerkungen
Da das Kopieren von std::invalid_argument keine Ausnahmen werfen darf, wird diese Nachricht typischerweise intern als separat zugeordneter, referenzgezählter String gespeichert. Deshalb gibt es auch keinen Konstruktor, der std::string&& akzeptiert: Der Inhalt müsste ohnehin kopiert werden.
Vor der Auflösung von LWG-Problem 254 konnte der Nicht-Kopierkonstruktor nur std::string akzeptieren. Dies machte die dynamische Speicherzuweisung zur obligatorischen Erstellung eines std::string-Objekts.
Nach der Auflösung von LWG-Problem 471 muss eine abgeleitete Standard-Ausnahmeklasse einen öffentlich zugänglichen Kopierkonstruktor haben. Dieser kann implizit definiert werden, solange die durch what() erhaltenen erklärenden Zeichenketten für das ursprüngliche und das kopierte Objekt gleich sind.
std::invalid_argument::operator=
| invalid_argument& operator=( const invalid_argument& other ); |
(noexcept seit C++11) | |
Weist den Inhalt dem von other zu. Wenn *this und other beide den dynamischen Typ std::invalid_argument haben, dann gilt nach der Zuweisung std::strcmp(what(), other.what()) == 0. Vom Kopierzuweisungsoperator kann keine Ausnahme geworfen werden.
Parameter
| Sonstiges | - | ein anderes Ausnahmeobjekt zum Zuweisen |
Rückgabewert
*this
Anmerkungen
Nach der Auflösung von LWG-Problem 471 muss eine abgeleitete Standard-Ausnahmeklasse einen öffentlich zugänglichen Kopierzuweisungsoperator haben. Dieser kann implizit definiert werden, solange die durch what() erhaltenen erklärenden Zeichenketten für das ursprüngliche und das zugewiesene Objekt gleich sind.
Abgeleitet von std::logic_error
Abgeleitet von std::exception
Memberfunktionen
| [virtuell] |
zerstört das Ausnahmeobjekt (virtuelle öffentliche Memberfunktion von std::exception) |
| [virtuell] |
gibt einen erklärenden String zurück (virtuelle öffentliche Memberfunktion von std::exception) |
[bearbeiten] Hinweise
Der Zweck dieses Ausnahmetyps ist ähnlich dem Fehlerzustand std::errc::invalid_argument (der in std::system_error aus Member-Funktionen von std::thread geworfen wird) und der zugehörigen errno-Konstante EINVAL.
[bearbeiten] Beispiel
#include <bitset> #include <iostream> #include <stdexcept> #include <string> int main() { try { std::bitset<4>{"012"}; // Throws: only '0' or '1' expected } catch (std::invalid_argument const& ex) { std::cout << "#1: " << ex.what() << '\n'; } try { [[maybe_unused]] int f = std::stoi("ABBA"); // Throws: no conversion } catch (std::invalid_argument const& ex) { std::cout << "#2: " << ex.what() << '\n'; } try { [[maybe_unused]] float f = std::stof("(3.14)"); // Throws: no conversion } catch (std::invalid_argument const& ex) { std::cout << "#3: " << ex.what() << '\n'; } }
Mögliche Ausgabe
#1: bitset string ctor has invalid argument #2: stoi: no conversion #3: stof: no conversion
[bearbeiten] Fehlerberichte
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 254 | C++98 | Der Konstruktor, der const char* akzeptiert, fehlte | hinzugefügt |
| LWG 471 | C++98 | die erklärenden Strings von std::invalid_argument'sKopien waren implementierungsabhängig |
sie sind identisch mit der des das ursprüngliche std::invalid_argument-Objekt |