std::overflow_error
| Definiert in der Header-Datei <stdexcept> |
||
| class overflow_error; |
||
Definiert einen Objekttyp, der als Ausnahme geworfen werden kann. Er kann zur Meldung von arithmetischen Überlauffehlern verwendet werden (d. h. Situationen, in denen das Ergebnis einer Berechnung zu groß für den Zieltyp ist).
|
Die einzige Standardbibliothekskomponente, die diese Ausnahme auslöst, ist std::bitset::to_ulong. |
(bis C++11) |
|
Die einzigen Standardbibliothekskomponenten, die diese Ausnahme auslösen, sind std::bitset::to_ulong und std::bitset::to_ullong. |
(seit C++11) |
Die mathematischen Funktionen der Standardbibliothekskomponenten lösen diese Ausnahme nicht aus (mathematische Funktionen melden Überlauffehler gemäß math_errhandling). Drittanbieterbibliotheken verwenden sie jedoch. Zum Beispiel wirft boost.math std::overflow_error, wenn boost::math::policies::throw_on_error aktiviert ist (Standardeinstellung).
Vererbungdiagramm
Inhalt |
[bearbeiten] Memberfunktionen
| (Konstruktor) |
konstruiert ein neues overflow_error-Objekt mit der angegebenen Nachricht(öffentliche Memberfunktion) |
| operator= |
weist dem overflow_error-Objekt neue Inhalte zu(öffentliche Memberfunktion) |
std::overflow_error::overflow_error
| overflow_error( const std::string& what_arg ); |
(1) | |
| overflow_error( const char* what_arg ); |
(2) | |
| overflow_error( const overflow_error& other ); |
(3) | (noexcept seit C++11) |
std::overflow_error haben, dann ist std::strcmp(what(), other.what()) == 0. Aus dem 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::overflow_error keine Ausnahmen auslösen darf, wird diese Nachricht typischerweise intern als separat allokierter, referenzgezählter String gespeichert. Dies ist auch der Grund, warum es keinen Konstruktor gibt, der std::string&& akzeptiert: Der Inhalt müsste sowieso 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::overflow_error::operator=
| overflow_error& operator=( const overflow_error& other ); |
(noexcept seit C++11) | |
Weist den Inhalt dem von other zu. Wenn *this und other beide den dynamischen Typ std::overflow_error haben, dann ist std::strcmp(what(), other.what()) == 0 nach der Zuweisung. Aus dem 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.
Geerbt von std::runtime_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] Beispiel
#include <iostream> #include <limits> #include <stdexcept> #include <utility> template<typename T, int N> requires (N > 0) /*...*/ class Stack { int top_{-1}; T data_[N]; public: [[nodiscard]] bool empty() const { return top_ == -1; } void push(T x) { if (top_ == N - 1) throw std::overflow_error("Stack overflow!"); data_[++top_] = std::move(x); } void pop() { if (empty()) throw std::underflow_error("Stack underflow!"); --top_; } T const& top() const { if (empty()) throw std::overflow_error("Stack is empty!"); return data_[top_]; } }; int main() { Stack<int, 4> st; try { [[maybe_unused]] auto x = st.top(); } catch (std::overflow_error const& ex) { std::cout << "1) Exception: " << ex.what() << '\n'; } st.push(1337); while (!st.empty()) st.pop(); try { st.pop(); } catch (std::underflow_error const& ex) { std::cout << "2) Exception: " << ex.what() << '\n'; } try { for (int i{}; i != 13; ++i) st.push(i); } catch (std::overflow_error const& ex) { std::cout << "3) Exception: " << ex.what() << '\n'; } }
Ausgabe
1) Exception: Stack is empty! 2) Exception: Stack underflow! 3) Exception: Stack overflow!
[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 Zeichenketten von std::overflow_errorKopien waren implementierungsabhängig |
sie sind identisch mit der des ursprüngliches std::overflow_error-Objekt |