Spec-Zone.ru › C++

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 (настройка по умолчанию).

cpp/error/exception cpp/error/runtime 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)
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. Из конструктора копирования не может быть выброшено исключение.

Параметры

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

Функции-члены

(destructor)
[virtual]
уничтожает объект исключения
(виртуальная открытая функция-член std::exception)
what
[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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API