Namensräume
Varianten
Aktionen

std::ios_base::failure

Von cppreference.com
< cpp‎ | io‎ | ios base
 
 
 
 
Definiert in Header <ios>
class failure;

Die Klasse std::ios_base::failure definiert ein Ausnahmeobjekt, das bei einem Fehler von den Funktionen der Input/Output-Bibliothek ausgelöst wird.

std::ios_base::failure kann entweder als Mitgliedsklasse von std::ios_base oder als Synonym (typedef) für eine andere Klasse mit entsprechender Funktionalität definiert werden.

(seit C++17)
cpp/error/exceptionstd-ios base-failure-2003-inheritance.svg

Vererbungdiagramm

(bis C++11)
cpp/error/exceptioncpp/error/runtime errorcpp/error/system errorstd-ios base-failure-inheritance.svg

Vererbungdiagramm

(seit C++11)

Inhalt

[edit] Member Functions

(Konstruktor)
Konstruiert ein neues failure-Objekt mit der gegebenen Nachricht
(öffentliche Memberfunktion)
operator=
Ersetzt das failure-Objekt
(öffentliche Memberfunktion)
what
gibt den erklärenden String zurück
(öffentliche Memberfunktion)

std::ios_base::failure::failure

(1)
explicit failure( const std::string& message );
(bis C++11)
explicit failure( const std::string& message,
                  const std::error_code& ec = std::io_errc::stream );
(seit C++11)
explicit failure( const char* message,
                  const std::error_code& ec = std::io_errc::stream );
(2) (seit C++11)
(3)
failure( const failure& other );
(bis C++11)
failure( const failure& other ) noexcept;
(seit C++11)
1,2) Konstruiert das Ausnahmeobjekt unter Verwendung von message als Erklärungstext, der später mit what() abgerufen werden kann. ec wird verwendet, um den spezifischen Grund für den Fehler zu identifizieren.(seit C++11)
3) Kopierkonstruktor. Initialisiert den Inhalt mit dem von other. Wenn *this und other beide den dynamischen Typ std::ios_base::failure haben, dann gilt std::strcmp(what(), other.what()) = 0.(seit C++11)

Parameter

message - erklärende Zeichenkette
ec - Fehlercode zur Identifizierung des spezifischen Grundes für den Fehler
Sonstiges - eine weitere zu kopierende failure

Anmerkungen

Da das Kopieren von std::ios_base::failure keine Ausnahmen auslösen darf, wird diese Nachricht typischerweise intern als separat zugewiesener, referenzgezählter String gespeichert. Dies ist auch der Grund, warum es keinen Konstruktor gibt, der std::string&& nimmt: der Inhalt müsste ohnehin kopiert werden.

std::ios_base::failure::operator=

failure& operator=( const failure& other );
(bis C++11)
failure& operator=( const failure& other ) noexcept;
(seit C++11)

Weist den Inhalt dem von other zu. Wenn *this und other beide den dynamischen Typ std::ios_base::failure haben, dann gilt std::strcmp(what(), other.what()) = 0 nach der Zuweisung.(seit C++11)

Parameter

Sonstiges - ein anderes Ausnahmeobjekt zum Zuweisen

Rückgabewert

*this

std::ios_base::failure::what

virtual const char* what() const throw();
(bis C++11)
virtual const char* what() const noexcept;
(seit C++11)

Gibt den erklärenden String zurück.

Rückgabewert

Zeiger auf einen implementierungsdefinierten, nullterminierten String mit erläuternden Informationen. Der String kann für die Konvertierung und Anzeige als std::wstring verwendet werden. Der Zeiger ist garantiert gültig, mindestens bis das Ausnahmeobjekt, von dem er stammt, zerstört wird, oder bis eine nicht-const Memberfunktion (z. B. der Kopierzuweisungsoperator) für das Ausnahmeobjekt aufgerufen wird.

Der zurückgegebene String ist während der konstanten Auswertung mit der gewöhnlichen Literal-Codierung kodiert.

(seit C++26)

Anmerkungen

Implementierungen dürfen what() überschreiben, sind aber nicht dazu verpflichtet.

Erbt von std::system_error

Memberfunktionen

gibt den Fehlercode zurück
(öffentliche Memberfunktion von std::system_error) [edit]
[virtuell]
gibt einen erklärenden String zurück
(virtuelle öffentliche Memberfunktion von std::system_error) [edit]

Geerbt von std::runtime_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]

[edit] Hinweise

Vor der Auflösung von LWG issue 331 deklarierte std::ios_base::failure einen Destruktor ohne throw(), während std::exception::~exception() mit throw() deklariert war[1]. Dies bedeutet, dass std::ios_base::failure::~failure() eine schwächere Exceptionspezifikation hatte. Die Auflösung besteht darin, diese Deklaration zu entfernen, damit die nicht-werfende Exceptionspezifikation beibehalten wird.

LWG issue 363 befasst sich mit demselben Fehler und seine Auflösung besteht darin, throw() zur Deklaration von std::ios_base::failure::~failure() hinzuzufügen. Diese Auflösung wurde aufgrund des Konflikts zwischen den beiden Auflösungen nicht angewendet.

  1. Die nicht-werfende Exceptionspezifikation wird nun global in der gesamten Standardbibliothek angewendet, sodass die Destruktoren von Klassen der Standardbibliothek nicht mit throw() oder noexcept deklariert werden.

[edit] Beispiel

#include <fstream>
#include <iostream>
 
int main()
{
    std::ifstream f("doesn't exist");
 
    try
    {
        f.exceptions(f.failbit);
    }
    catch (const std::ios_base::failure& e)
    {
        std::cout << "Caught an ios_base::failure.\n"
                  << "Explanatory string: " << e.what() << '\n'
                  << "Error code: " << e.code() << '\n';
    }
}

Mögliche Ausgabe

Caught an ios_base::failure.
Explanatory string: ios_base::clear: unspecified iostream_category error
Error code: iostream:1

[edit] Defect Reports

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 48 C++98 die Konstruktorüberladung (1) initialisierte die Basisklasse std::exception
mit msg, aber die Basisklasse hat keinen passenden Konstruktor
entsprechend
Beschreibung entfernt
LWG 331 C++98 std::ios_base::failure deklarierte einen Destruktor ohne throw() Deklaration des Destruktors entfernt

[edit] Siehe auch

(C++11)
die IO-Stream-Fehlercodes
(Aufzählung) [bearbeiten]