Пространства имён
Варианты
Действия

std::overflow_error

Материал из cppreference.com
< cpp‎ | error
 
 
Библиотека диагностики
Обработка исключений
Сбои обработки исключений
(до C++17*)
(до C++17*)
(C++11)(до C++17*)    
(до C++17*)
Коды ошибок
Коды ошибок
Категории исключений
overflow_error
(ТС TM)
Поддержка системных ошибок
(C++11)
(C++11)
Утверждения
Трассировка стека
 
Определено в заголовочном файле <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 включено (настройка по умолчанию).

cpp/error/exceptioncpp/error/runtime errorstd-overflow error-inheritance.svg

Диаграмма наследования

Содержание

[править] Функции-элементы

(конструктор)
создаёт новый объект overflow_error с заданным сообщением
(public функция-элемент)
operator=
заменяет объект overflow_error
(public функция-элемент)

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)
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=

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 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())
            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