std::overflow_error
Определён в заголовочном файле <stdexcept> | ||
|---|---|---|
class overflow_error; |
Определяет тип объекта, который выбрасывается как исключение. Может использоваться для сообщения об ошибках арифметического переполнения (то есть ситуациях, когда результат вычисления слишком велик для целевого типа).
| Единственный компонент стандартной библиотеки, выбрасывающий это исключение, — | (до C++11) |
| Единственные компоненты стандартной библиотеки, выбрасывающие это исключение, — | (начиная с C++11) |
Математические функции компонентов стандартной библиотеки не выбрасывают это исключение (математические функции сообщают об ошибках переполнения согласно спецификации в math_errhandling). Однако это исключение используется сторонними библиотеками. Например, boost.math выбрасывает std::overflow_error, если включён boost::math::policies::throw_on_error (настройка по умолчанию).
Диаграмма наследования
Функции-члены
|
(constructor) | создаёт новый объект 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) | |
overflow_error( const overflow_error& other ); | (3) | (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. Из конструктора копирования не может быть выброшено исключение.Параметры
| 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 ); | (noexcept начиная с C++11) |
Присваивает объекту содержимое other. Если *this и other имеют динамический тип std::overflow_error, то после присваивания std::strcmp(what(), other.what()) == 0. Из оператора присваивания копированием не может быть выброшено исключение.
Параметры
| other | - | другой объект исключения, содержимое которого присваивается |
Возвращаемое значение
*this
Примечания
После принятия решения по вопросу LWG 471 производный класс стандартного исключения должен иметь общедоступный оператор присваивания копированием. Он может быть определён неявно, если поясняющие строки, полученные с помощью what(), одинаковы для исходного и скопированного объектов.
Унаследовано от std::runtime_error
Унаследовано от std::exception
Функции-члены
|
[virtual] | уничтожает объект исключения (виртуальная открытая функция-член std::exception) |
|
[virtual] | возвращает поясняющую строку (виртуальная открытая функция-член 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/cpp/error/overflow_error