std::overflow_error — cppreference.com
Материал из cppreference.com
<tbody> </tbody>
|
|
||
Определяет тип объекта, который бросается как исключение. Его можно использовать для сообщения об ошибках арифметического переполнения (то есть в ситуациях, когда результат вычисления слишком велик для целевого типа).
|
Единственный компонент стандартной библиотеки, который генерирует это исключение, это std::bitset::to_ulong. |
(до C++11) |
|
Единственными компонентами стандартной библиотеки, генерирующими это исключение, являются std::bitset::to_ulong и std::bitset::to_ullong. |
(начиная с C++11) |
Математические функции компонентов стандартной библиотеки не генерируют это исключение (математические функции сообщают об ошибках переполнения, как указано в math_errhandling). Однако сторонние библиотеки используют его. Например,
boost.math генерирует std::overflow_error, если boost::math::policies::throw_on_error включено (настройка по умолчанию).
Диаграмма наследования
Функции-элементы
создаёт новый объект overflow_error с заданным сообщением (public функция-элемент) | |
заменяет объект overflow_error (public функция-элемент) |
std::overflow_error::overflow_error
<tbody> </tbody> <tbody class="t-dcl-rev t-dcl-rev-num "> </tbody><tbody> </tbody>
|
|
(1) | |
|
|
(2) | |
| (3) | ||
|
|
(до C++11) | |
|
|
(начиная с C++11) | |
1) Создаёт объект исключения с what_arg в качестве пояснительной строки. После создания std::strcmp(what(), what_arg.c_str()) == 0.
2) Создаёт объект исключения с what_arg в качестве пояснительной строки. После создания std::strcmp(what(), what_arg) == 0.
3) Конструктор копирования. Если *this и other имеют динамический тип std::overflow_error, тогда std::strcmp(what(), other.what()) == 0. Исключения не могут быть сгенерированы из конструктора копирования. (до C++11)
Параметры
| what_arg | — | пояснительная строка |
| other | — | другой объект исключения для копирования |
Исключения
1,2) Может генерировать std::bad_alloc.
Примечание
Поскольку при копировании std::overflow_error не разрешается создавать исключения, это сообщение обычно хранится внутри в виде отдельно выделенной строки с подсчётом ссылок. По этой же причине нет конструктора, принимающего std::string&&: ему всё равно пришлось бы копировать содержимое.
До разрешения LWG проблема 254, некопирующий конструктор может принимать только std::string. Это делает динамическое размещение обязательным для создания объекта std::string.
После разрешения LWG проблема 471, производный стандартный класс исключения должен иметь общедоступный конструктор копирования. Его можно определить неявно, если поясняющие строки, полученные с помощью what(), одинаковы для исходного объекта и скопированного объекта.
std::overflow_error::operator=
<tbody> </tbody> <tbody class="t-dcl-rev "> </tbody><tbody> </tbody>
|
|
(до C++11) | |
|
|
(начиная с C++11) | |
Присваивает содержимое из other. Если *this и other имеют динамический тип std::overflow_error, тогда std::strcmp(what(), other.what()) == 0 после присваивания. Оператор присваивания копированием не может вызвать исключение. (до C++11)
Параметры
| other | — | другой объект исключения для присваивания |
Возвращаемое значение
*this
Примечание
После разрешения LWG проблема 471, производный стандартный класс исключения должен иметь общедоступный оператор присваивания копированием. Его можно определить неявно, если поясняющие строки, полученные с помощью what(), одинаковы для исходного объекта и скопированного объекта.
Унаследован от std::exception
Функции-элементы
| уничтожает объект исключения (virtual public of std::exception функция-элемент) [править]
| |
| возвращает поясняющую строку (virtual public of 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("Переполнение стека!"); data_[++top_] = std::move(x); } void pop() { if (empty()) throw std::underflow_error("Опустошение стека!"); --top_; } T const& top() const { if (empty()) throw std::overflow_error("Стек пуст!"); 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) Исключение: " << ex.what() << '\n'; } st.push(1337); while (not st.empty()) st.pop(); try { st.pop(); } catch (std::overflow_error const& ex) { std::cout << "2) Исключение: " << ex.what() << '\n'; } try { for (int i {}; i != 13; ++i) st.push(i); } catch (std::overflow_error const& ex) { std::cout << "3) Исключение: " << ex.what() << '\n'; } }
Вывод:
1) Исключение: Стек пуст! 2) Исключение: Опустошение стека! 3) Исключение: Переполнение стека!
Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
| Номер | Применён | Поведение в стандарте | Корректное поведение |
|---|---|---|---|
| LWG 254 | C++98 | конструктор, принимающий const char*, отсутствовал
|
добавлен |
| LWG 471 | C++98 | пояснительные строки копий std::overflow_error былиопределены реализацией |
они такие же, как у исходного объектаstd::overflow_error
|