std::runtime_error
Определено в заголовке <stdexcept> |
||
|---|---|---|
class runtime_error; |
Определяет тип объекта, который должен быть брошен как исключение. Он сообщает об ошибках, которые вызваны событиями, выходящими за пределы области программы и которые трудно предсказать.
Исключения типа std::runtime_error выбрасываются следующими компонентами стандартной библиотеки: std::locale::locale и std::locale::combine.
Кроме того, следующие типы стандартных исключений являются производными от std::runtime_error:
| (с C++11) |
|
(с C++20) |
Диаграмма наследования
Члены-функции
|
(конструктор)
|
создаёт новый объект 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) |
what_arg в качестве строки объяснения. После создания, std::strcmp(what(), what_arg.c_str()) == 0. what_arg в качестве строки объяснения. После создания, std::strcmp(what(), what_arg) == 0. *this и other оба имеют динамический тип std::runtime_error, то std::strcmp(what(), other.what()) == 0. Ни одно исключение не может быть сгенерировано в конструкторе копирования.(до C++11)
Параметры
| what_arg | - | строка объяснения |
| other | - | другой объект исключения для копирования |
Исключения
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) |
|
[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