| I/O manipulators | ||||
| Print functions(C++23) | ||||
| C-style I/O | ||||
| Buffers | ||||
(C++23) | ||||
(C++98/26*) | ||||
(C++20) | ||||
| Streams | ||||
| Abstractions | ||||
| File I/O | ||||
| String I/O | ||||
| Array I/O | ||||
(C++23) | ||||
(C++23) | ||||
(C++23) | ||||
(C++98/26*) | ||||
(C++98/26*) | ||||
(C++98/26*) | ||||
| Synchronized Output | ||||
(C++20) | ||||
| Types | ||||
| Error category interface | ||||
(C++11) | ||||
(C++11) |
| Member functions | ||||
| Formatting | ||||
| Locales | ||||
| Internal extensible array | ||||
| Miscellaneous | ||||
| Member classes | ||||
ios_base::failure | ||||
| Member types | ||||
Defined in header <ios> | ||
class failure; | ||
The classstd::ios_base::failure defines an exception object that is thrown on failure by the functions in the Input/Output library.
| (since C++17) |
Inheritance diagram | (until C++11) |
Inheritance diagram | (since C++11) |
Contents |
(constructor) | constructs a newfailure object with the given message(public member function) |
operator= | replaces thefailure object(public member function) |
what | returns the explanatory string (public member function) |
| (1) | ||
explicit failure(conststd::string& message); | (until C++11) | |
explicit failure(conststd::string& message, conststd::error_code& ec=std::io_errc::stream); | (since C++11) | |
explicit failure(constchar* message, conststd::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 thenstd::strcmp(what(), other.what())==0.(since C++11)| message | - | explanatory string |
| ec | - | error code to identify the specific reason for the failure |
| other | - | anotherfailure to copy |
Because copyingstd::ios_base::failure is not permitted to throw exceptions, this message is typically stored internally as a separately-allocated reference-counted string. This is also why there is no constructor takingstd::string&&: it would have to copy the content anyway.
failure& operator=(const failure& other); | (until C++11) | |
failure& operator=(const failure& other)noexcept; | (since C++11) | |
Assigns the contents with those ofother.If*this andother both have dynamic typestd::ios_base::failure thenstd::strcmp(what(), other.what())==0 after assignment.(since C++11)
| other | - | another exception object to assign with |
*this
virtualconstchar* what()constthrow(); | (until C++11) | |
virtualconstchar* what()constnoexcept; | (since C++11) | |
Returns the explanatory string.
Pointer to an implementation-defined null-terminated string with explanatory information. The string is suitable for conversion and display as astd::wstring. The pointer is guaranteed to be valid at least until the exception object from which it is obtained is destroyed, or until a non-const member function (e.g. copy assignment operator) on the exception object is called.
Implementations are allowed but not required to overridewhat().
| returns error code (public member function of std::system_error)[edit] | |
[virtual] | returns an explanatory string (virtual public member function of std::system_error)[edit] |
[virtual] | destroys the exception object (virtual public member function of std::exception)[edit] |
[virtual] | returns an explanatory string (virtual public member function of std::exception)[edit] |
Before the resolution ofLWG issue 331,std::ios_base::failure declared a destructor withoutthrow(), wherestd::exception::~exception() was declared withthrow()[1]. This means thestd::ios_base::failure::~failure() had a weaker exception specification. The resolution is to remove that declaration so that the non-throwing exception specification is kept.
LWG issue 363 targets the same defect and its resolution is to addthrow() to the declaration ofstd::ios_base::failure::~failure(). That resolution was not applied due to the conflict between the two resolutions.
#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';}}
Possible output:
Caught an ios_base::failure.Explanatory string: ios_base::clear: unspecified iostream_category errorError code: iostream:1
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 48 | C++98 | the constructor overload (1) initialized the base classstd::exception withmsg, but the base class does not have a matching constructor | corresponding description removed |
| LWG 331 | C++98 | std::ios_base::failure declared a destructor withoutthrow() | removed the destructor declaration |
(C++11) | the IO stream error codes (enum)[edit] |