Namensräume
Varianten
Aktionen

std::invalid_argument

Von cppreference.com
< cpp‎ | error
 
 
 
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.

cpp/error/exceptioncpp/error/logic errorstd-invalid argument-inheritance.svg

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)
1) Konstruiert das Ausnahmeobjekt mit what_arg als erklärende Zeichenkette. Nach der Konstruktion gilt std::strcmp(what(), what_arg.c_str()) == 0.
2) Konstruiert das Ausnahmeobjekt mit what_arg als erklärende Zeichenkette. Nach der Konstruktion gilt std::strcmp(what(), what_arg) == 0.
3) Kopierkonstruktor. Wenn *this und other beide den dynamischen Typ 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

1,2) Kann std::bad_alloc auslösen.

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) [bearbeiten]
[virtuell]
gibt einen erklärenden String zurück
(virtuelle öffentliche Memberfunktion von std::exception) [bearbeiten]

[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's
Kopien waren implementierungsabhängig
sie sind identisch mit der des
das ursprüngliche std::invalid_argument-Objekt