Spec-Zone.ru › C++

std::runtime_error

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

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

Исключения типа std::runtime_error выбрасываются следующими компонентами стандартной библиотеки: std::locale::locale и std::locale::combine.

Кроме того, следующие типы стандартных исключений являются производными от std::runtime_error:

  • std::range_error
  • std::overflow_error
  • std::underflow_error
  • std::regex_error
  • std::system_error
(с C++11)
  • std::chrono::ambiguous_local_time
  • std::chrono::nonexistent_local_time
  • std::format_error
(с C++20)
cpp/error/exceptionstd-runtime error-inheritance.svg

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

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

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

std::runtime_error::runtime_error

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

Параметры

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

Исключения

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

Примечания

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

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

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

std::runtime_error::operator=

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

Присваивает содержимое объекта other. Если *this и other оба имеют динамический тип std::runtime_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::runtime_error были реализационно-зависимы они одинаковы с оригинальным объектом std::runtime_error

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

Spec-Zone.ru

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