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 errorstd-overflow error-inheritance.svg

Схема наследования

Члены-функции

(конструктор)
создаёт новый объект 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)
(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

Члены-функции

(деструктор)
[виртуальный]
уничтожает объект исключения
(виртуальная публичная функция-член класса std::exception)
what
[виртуальный]
возвращает поясняющую строку
(виртуальная публичная функция-член класса 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/w/cpp/error/overflow_error

Spec-Zone.ru

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