std::ios_base:: failure
|
Определено в заголовочном файле
<ios>
|
||
|
class
failure
;
|
||
Класс
std::ios_base::failure
определяет объект исключения, который выбрасывается при сбое функциями библиотеки ввода/вывода.
|
|
(начиная с C++17) |
|
Диаграмма наследования |
(до C++11) |
|
Диаграмма наследования |
(начиная с C++11) |
Содержание |
Функции-члены
|
(constructor)
|
создает новый объект
failure
с заданным сообщением
(public member function) |
|
operator=
|
заменяет объект
failure
(public member function) |
|
what
|
возвращает поясняющую строку
(public member function) |
std::ios_base::failure:: failure
| (1) | ||
|
explicit
failure
(
const
std::
string
&
message
)
;
|
(until C++11) | |
|
explicit
failure
(
const
std::
string
&
message,
const std:: error_code & ec = std:: io_errc :: stream ) ; |
(since C++11) | |
|
explicit
failure
(
const
char
*
message,
const std:: error_code & ec = std:: io_errc :: stream ) ; |
(2) | (since C++11) |
| (3) | ||
|
failure
(
const
failure
&
other
)
;
|
(until C++11) | |
|
failure
(
const
failure
&
other
)
noexcept
;
|
(since C++11) | |
std::ios_base::failure
, то
std::
strcmp
(
what
(
)
, other.
what
(
)
)
==
0
.
(since C++11)
Параметры
| message | - | пояснительная строка |
| ec | - | код ошибки для идентификации конкретной причины сбоя |
| other | - |
другой объект
failure
для копирования
|
Примечания
Поскольку копирование
std::ios_base::failure
не должно вызывать исключения, это сообщение обычно хранится внутри как отдельно выделенная строка с подсчетом ссылок. Это также объясняет, почему нет конструктора, принимающего
std::
string
&&
: в любом случае пришлось бы копировать содержимое.
std::ios_base::failure:: operator=
|
failure
&
operator
=
(
const
failure
&
other
)
;
|
(до C++11) | |
|
failure
&
operator
=
(
const
failure
&
other
)
noexcept
;
|
(начиная с C++11) | |
Присваивает содержимое из
other
.
Если
*
this
и
other
оба имеют динамический тип
std::ios_base::failure
, то
std::
strcmp
(
what
(
)
, other.
what
(
)
)
==
0
после присваивания.
(начиная с C++11)
Параметры
| other | - | другой объект исключения для присваивания |
Возвращаемое значение
* this
std::ios_base::failure:: what
|
virtual
const
char
*
what
(
)
const
throw
(
)
;
|
(до C++11) | |
|
virtual
const
char
*
what
(
)
const
noexcept
;
|
(начиная с C++11) | |
Возвращает пояснительную строку.
Возвращаемое значение
Указатель на определённую реализацией нуль-терминированную строку с пояснительной информацией. Строка подходит для преобразования и отображения как std::wstring . Гарантируется, что указатель остаётся действительным по крайней мере до тех пор, пока не будет уничтожен объект исключения, из которого он получен, или пока не будет вызвана неконстантная функция-член (например, оператор копирующего присваивания) для объекта исключения.
Примечания
Реализациям разрешено, но не требуется, переопределять
what()
.
Унаследовано от std:: system_error
Функции-члены
|
возвращает код ошибки
(публичная функция-член
std::system_error
)
|
|
|
[virtual]
|
возвращает пояснительную строку
(виртуальная публичная функция-член
std::system_error
)
|
Унаследовано от std:: runtime_error
Унаследовано от std:: exception
Функции-члены
|
[виртуальный]
|
уничтожает объект исключения
(виртуальная публичная функция-член
std::exception
)
|
|
[виртуальный]
|
возвращает поясняющую строку
(виртуальная публичная функция-член
std::exception
)
|
Примечания
До разрешения
проблемы LWG 331
,
std::ios_base::failure
объявлял деструктор без
throw
(
)
, тогда как
std::exception::~exception()
был объявлен с
throw
(
)
[1]
. Это означало, что
std::ios_base::failure::~failure()
имел более слабую спецификацию исключений. Решением стало удаление этого объявления, чтобы сохранить небросающую спецификацию исключений.
Проблема LWG 363
нацелена на тот же дефект, и её решение заключается в добавлении
throw
(
)
к объявлению
std::ios_base::failure::~failure()
. Это решение не было применено из-за конфликта между двумя предложенными решениями.
- ↑ Спецификация исключений без выбрасывания теперь применяется глобально по всей стандартной библиотеке , поэтому деструкторы классов стандартной библиотеки не объявляются с throw ( ) или noexcept .
Пример
#include <fstream> #include <iostream> int main() { std::ifstream f("doesn't exist"); try { f.exceptions(f.failbit); } catch (const std::ios_base::failure& e) { std::cout << "Caught an ios_base::failure.\n" << "Explanatory string: " << e.what() << '\n' << "Error code: " << e.code() << '\n'; } }
Возможный вывод:
Caught an ios_base::failure. Explanatory string: ios_base::clear: unspecified iostream_category error Error code: iostream:1
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 48 | C++98 |
конструктор перегрузки (1) инициализировал базовый класс
std::exception
с помощью msg , но базовый класс не имеет соответствующего конструктора |
соответствующее
описание удалено |
| LWG 331 | C++98 |
std::ios_base::failure
объявлял деструктор без
throw
(
)
|
удалил объявление деструктора |
Смотрите также
|
(C++11)
|
коды ошибок потокового ввода-вывода
(перечисление) |