std::overflow_error
Определено в заголовке <stdexcept> | ||
|---|---|---|
class overflow_error; |
Определяет тип объекта, который должен быть сгенерирован в качестве исключения. Он может быть использован для отчёта об ошибках арифметического переполнения (т.е., ситуации, где результат вычисления слишком велик для целевого типа).
| Единственным компонентом стандартной библиотеки, который генерирует это исключение, является | (до C++11) |
| Единственными компонентами стандартной библиотеки, которые генерируют это исключение, являются | (с C++11) |
Математические функции компонентов стандартной библиотеки не генерируют это исключение (математические функции сообщают об ошибках переполнения, как указано в math_errhandling). Однако сторонние библиотеки это используют. Например, boost.math генерирует std::overflow_error если boost::math::policies::throw_on_error включено (по умолчанию).
Схема наследования
Члены-функции
| (конструктор) | создаёт новый объект overflow_error с заданным сообщением (публичная функция-член) |
| operator= | заменяет объект overflow_error (публичная функция-член) |
std::overflow_error::overflow_error
overflow_error( const std::string& what_arg ); | (1) | |
overflow_error( const char* what_arg ); | (2) | |
| (3) | ||
overflow_error( const overflow_error& other ); | (до C++11) | |
overflow_error( const overflow_error& other ) noexcept; | (с C++11) |
what_arg в качестве поясняющей строки. После создания std::strcmp(what(), what_arg.c_str()) == 0.what_arg в качестве поясняющей строки. После создания std::strcmp(what(), what_arg) == 0.*this и other оба имеют динамический тип std::overflow_error, то std::strcmp(what(), other.what()) == 0. Исключение не может быть сгенерировано из конструктора копирования.(до C++11)
Параметры
| what_arg | - | поясняющая строка |
| other | - | другой объект исключения для копирования |
Исключение
std::bad_alloc.Примечания
Поскольку копирование std::overflow_error не разрешено для генерации исключений, это сообщение обычно хранится в памяти как отдельная строка с подсчётом ссылок. Поэтому нет конструктора, принимающего std::string&&: он всё равно должен копировать содержимое.
До решения проблемы LWG 254, некопируемый конструктор может принимать только std::string. Это делает динамическое выделение памяти обязательным для построения объекта std::string.
После решения проблемы LWG 471, производный стандартный класс исключений должен иметь открытый конструктор копирования. Он может быть неявно определён, если строки описания, полученные с помощью what() , совпадают для исходного и скопированного объекта.
std::overflow_error::operator=
overflow_error& operator=( const overflow_error& other ); | (до C++11) | |
overflow_error& operator=( const overflow_error& other ) noexcept; | (с C++11) |
Присваивает содержимое объекта other. Если *this и other оба имеют динамический тип std::overflow_error, то std::strcmp(what(), other.what()) == 0 после присвоения. Исключение не может быть сгенерировано из оператора копирующего присваивания.(до C++11)
Параметры
| other | - | другой объект исключения для присваивания |
Возвращаемое значение
*this
Примечания
После решения проблемы LWG 471, производный стандартный класс исключений должен иметь открытый оператор копирующего присваивания. Он может быть неявно определён, если строки описания, полученные с помощью what() , совпадают для исходного и скопированного объекта.
Унаследовано от std::runtime_error
Унаследовано от std::exception
Члены-функции
|
[виртуальный] | уничтожает объект исключения (виртуальная публичная функция-член класса std::exception) |
|
[виртуальный] | возвращает поясняющую строку (виртуальная публичная функция-член класса std::exception) |
Пример
#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';
}
}Вывод:
1) Exception: Stack is empty! 2) Exception: Stack underflow! 3) Exception: Stack overflow!
Отчёты об ошибках
Следующие отчёты об ошибках, меняющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применено к | Поведение, опубликованное | Корректное поведение |
|---|---|---|---|
| LWG 254 | C++98 | конструктор, принимающий const char*, отсутствовал | добавлено |
| LWG 471 | C++98 | строки описания копий std::overflow_error были реализационно-зависимыми | они совпадают со строкой описания исходного объекта std::overflow_error |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/error/overflow_error