Spec-Zone.ru › C++

std::logic_error

Определено в заголовке <stdexcept>
class logic_error;

Определяет тип объекта, который должен быть брошен в качестве исключения. Он сообщает об ошибках, являющихся следствием неправильной логики в программе, таких как нарушение логических предпосылок или инвариантов класса, и которые могут быть предотвращены.

Ни один стандартный компонент библиотеки не выбрасывает это исключение напрямую, но типы исключений std::invalid_argument, std::domain_error, std::length_error, std::out_of_range, std::future_error, и std::experimental::bad_optional_access являются производными от std::logic_error.

cpp/error/exceptionstd-logic error-inheritance.svg

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

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

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

std::logic_error::logic_error

logic_error( const std::string& what_arg );
(1)
logic_error( const char* what_arg );
(2)
(3)
logic_error( const logic_error& other );
(до C++11)
logic_error( const logic_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::logic_error то std::strcmp(what(), other.what()) == 0. Исключение бросить нельзя из конструктора копирования.(до C++11)

Параметры

what_arg - строка описания
other - другой объект исключения для копирования

Исключения

1,2) Может выбросить std::bad_alloc.

Примечания

Поскольку копирование std::logic_error запрещено выбрасывать исключения, это сообщение обычно хранится внутри как отдельная строка с подсчетом ссылок. Вот почему нет конструктора, принимающего std::string&&: пришлось бы копировать содержимое в любом случае.

До решения проблемы LWG issue 254, конструктор без копирования может принимать только std::string. Это делает обязательной динамическую аллокация для построения объекта std::string.

После решения проблемы LWG issue 471, производный стандартный класс исключения должен иметь доступный в публичном доступе конструктор копирования. Он может быть неявно определен, если строки описания, полученные из what(), совпадают для исходного объекта и скопированного объекта.

std::logic_error::operator=

logic_error& operator=( const logic_error& other );
(до C++11)
logic_error& operator=( const logic_error& other ) noexcept;
(с C++11)

Присваивает содержимое объекта other. Если *this и other оба имеют динамический тип std::logic_error то std::strcmp(what(), other.what()) == 0 после присваивания. Исключение бросить нельзя из оператора копирующего присваивания.(до C++11)

Параметры

other - другой объект исключения для присваивания

Возвращаемое значение

*this

Примечания

После решения проблемы LWG issue 471, производный стандартный класс исключения должен иметь доступный в публичном доступе оператор копирующего присваивания. Он может быть неявно определен, если строки описания, полученные из what() , совпадают для исходного объекта и скопированного объекта.

Наследуется от std::exception

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

(деструктор)
[virtual]
уничтожает объект исключения
(виртуальная публичная функция-член std::exception)
what
[virtual]
возвращает строку описания
(виртуальная публичная функция-член std::exception)

Отчеты об ошибках

Следующие отчеты об ошибках, которые изменяли поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применён к Поведение, как опубликовано Правильное поведение
LWG 254 C++98 конструктор, принимающий const char* отсутствовал добавлен
LWG 471 C++98 строки описания копий std::logic_error были определены реализацией они совпадают со строкой описания
исходного объекта std::logic_error

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/error/logic_error

Spec-Zone.ru

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