std::overflow_error
Определено в заголовочном файле <stdexcept> | ||
class overflow_error; | ||
Определяет тип объекта, который бросается как исключение. Его можно использовать для сообщения об ошибках арифметического переполнения (то есть в ситуациях, когда результат вычисления слишком велик для целевого типа).
Единственный компонент стандартной библиотеки, который генерирует это исключение, это 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 функция-элемент) |
operator= | заменяет объект overflow_error (public функция-элемент) |
std::overflow_error::overflow_error
overflow_error(conststd::string& what_arg ); | (1) | |
overflow_error(constchar* what_arg ); | (2) | |
(3) | ||
overflow_error(const overflow_error& other ); | (до C++11) | |
overflow_error(const overflow_error& other )noexcept; | (начиная с C++11) | |
std::overflow_error
, тогда std::strcmp(what(), other.what())==0. Исключения не могут быть сгенерированы из конструктора копирования.(до C++11)Параметры
what_arg | — | пояснительная строка |
other | — | другой объект исключения для копирования |
Исключения
Примечание
Поскольку при копировании 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
Функции-элементы
[virtual] | уничтожает объект исключения (virtual public of std::exception функция-элемент) |
[virtual] | возвращает поясняющую строку (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())throwstd::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_errorconst& ex){std::cout<<"1) Исключение: "<< ex.what()<<'\n';} st.push(1337);while(not st.empty()) st.pop(); try{ st.pop();}catch(std::overflow_errorconst& ex){std::cout<<"2) Исключение: "<< ex.what()<<'\n';} try{for(int i {}; i !=13;++i) st.push(i);}catch(std::overflow_errorconst& ex){std::cout<<"3) Исключение: "<< ex.what()<<'\n';}}
Вывод:
1) Исключение: Стек пуст! 2) Исключение: Опустошение стека! 3) Исключение: Переполнение стека!
[править]Отчёты о дефектах
Следующие изменения поведения были применены с обратной силой к ранее опубликованным стандартам C++:
Номер | Применён | Поведение в стандарте | Корректное поведение |
---|---|---|---|
LWG 254 | C++98 | конструктор, принимающий constchar*, отсутствовал | добавлен |
LWG 471 | C++98 | пояснительные строки копий std::overflow_error былиопределены реализацией | они такие же, как у исходного объектаstd::overflow_error |