#
Subclause [syserr] describes components that the standard library and C++ programs may use to report error conditions originating from the operating system or other low-level application program interfaces.
2
#
Components described in [syserr] do not change the value of errno ([errno]).
Recommended practice: Implementations should leave the error states provided by other libraries unchanged.

19.5.2 Header <system_error> synopsis [system.error.syn]

#include <compare> / see [compare.syn] namespace std { class error_category; const error_category& generic_category() noexcept; const error_category& system_category() noexcept; class error_code; class error_condition; class system_error; template<class T> struct is_error_code_enum : public false_type {}; template<class T> struct is_error_condition_enum : public false_type {}; enum class errc { / freestanding address_family_not_supported, / EAFNOSUPPORT address_in_use, / EADDRINUSE address_not_available, / EADDRNOTAVAIL already_connected, / EISCONN argument_list_too_long, / E2BIG argument_out_of_domain, / EDOM bad_address, / EFAULT bad_file_descriptor, / EBADF bad_message, / EBADMSG broken_pipe, / EPIPE connection_aborted, / ECONNABORTED connection_already_in_progress, / EALREADY connection_refused, / ECONNREFUSED connection_reset, / ECONNRESET cross_device_link, / EXDEV destination_address_required, / EDESTADDRREQ device_or_resource_busy, / EBUSY directory_not_empty, / ENOTEMPTY executable_format_error, / ENOEXEC file_exists, / EEXIST file_too_large, / EFBIG filename_too_long, / ENAMETOOLONG function_not_supported, / ENOSYS host_unreachable, / EHOSTUNREACH identifier_removed, / EIDRM illegal_byte_sequence, / EILSEQ inappropriate_io_control_operation, / ENOTTY interrupted, / EINTR invalid_argument, / EINVAL invalid_seek, / ESPIPE io_error, / EIO is_a_directory, / EISDIR message_size, / EMSGSIZE network_down, / ENETDOWN network_reset, / ENETRESET network_unreachable, / ENETUNREACH no_buffer_space, / ENOBUFS no_child_process, / ECHILD no_link, / ENOLINK no_lock_available, / ENOLCK no_message, / ENOMSG no_protocol_option, / ENOPROTOOPT no_space_on_device, / ENOSPC no_such_device_or_address, / ENXIO no_such_device, / ENODEV no_such_file_or_directory, / ENOENT no_such_process, / ESRCH not_a_directory, / ENOTDIR not_a_socket, / ENOTSOCK not_connected, / ENOTCONN not_enough_memory, / ENOMEM not_supported, / ENOTSUP operation_canceled, / ECANCELED operation_in_progress, / EINPROGRESS operation_not_permitted, / EPERM operation_not_supported, / EOPNOTSUPP operation_would_block, / EWOULDBLOCK owner_dead, / EOWNERDEAD permission_denied, / EACCES protocol_error, / EPROTO protocol_not_supported, / EPROTONOSUPPORT read_only_file_system, / EROFS resource_deadlock_would_occur, / EDEADLK resource_unavailable_try_again, / EAGAIN result_out_of_range, / ERANGE state_not_recoverable, / ENOTRECOVERABLE text_file_busy, / ETXTBSY timed_out, / ETIMEDOUT too_many_files_open_in_system, / ENFILE too_many_files_open, / EMFILE too_many_links, / EMLINK too_many_symbolic_link_levels, / ELOOP value_too_large, / EOVERFLOW wrong_protocol_type, / EPROTOTYPE }; template<> struct is_error_condition_enum<errc> : true_type {}; / [syserr.errcode.nonmembers], non-member functions error_code make_error_code(errc e) noexcept; template<class charT, class traits> basic_ostream<charT, traits>& operator<(basic_ostream<charT, traits>& os, const error_code& ec); / [syserr.errcondition.nonmembers], non-member functions error_condition make_error_condition(errc e) noexcept; / [syserr.compare], comparison operator functions bool operator=(const error_code& lhs, const error_code& rhs) noexcept; bool operator=(const error_code& lhs, const error_condition& rhs) noexcept; bool operator=(const error_condition& lhs, const error_condition& rhs) noexcept; strong_ordering operator<=>(const error_code& lhs, const error_code& rhs) noexcept; strong_ordering operator<=>(const error_condition& lhs, const error_condition& rhs) noexcept; / [syserr.hash], hash support template<class T> struct hash; template<> struct hash<error_code>; template<> struct hash<error_condition>; / [syserr], system error support template<class T> constexpr bool is_error_code_enum_v = is_error_code_enum<T>::value; template<class T> constexpr bool is_error_condition_enum_v = is_error_condition_enum<T>::value; }
The value of each enum errc enumerator is the same as the value of the <cerrno> macro shown in the above synopsis.
Whether or not the <system_error> implementation exposes the <cerrno> macros is unspecified.
The is_error_code_enum and is_error_condition_enum templates may be specialized for program-defined types to indicate that such types are eligible for class error_code and class error_condition implicit conversions, respectively.

19.5.3 Class error_category [syserr.errcat]

The class error_category serves as a base class for types used to identify the source and encoding of a particular category of error code.
Classes may be derived from error_category to support categories of errors in addition to those defined in this document.
Such classes shall behave as specified in subclause [syserr.errcat].
[Note 1: 
error_category objects are passed by reference, and two such objects are equal if they have the same address.
If there is more than a single object of a custom error_category type, such equality comparisons can evaluate to false even for objects holding the same value.
— end note]
namespace std { class error_category { public: constexpr error_category() noexcept; virtual ~error_category(); error_category(const error_category&) = delete; error_category& operator=(const error_category&) = delete; virtual const char* name() const noexcept = 0; virtual error_condition default_error_condition(int ev) const noexcept; virtual bool equivalent(int code, const error_condition& condition) const noexcept; virtual bool equivalent(const error_code& code, int condition) const noexcept; virtual string message(int ev) const = 0; bool operator=(const error_category& rhs) const noexcept; strong_ordering operator<=>(const error_category& rhs) const noexcept; }; const error_category& generic_category() noexcept; const error_category& system_category() noexcept; }
virtual const char* name() const noexcept = 0;
Returns: A string naming the error category.
virtual error_condition default_error_condition(int ev) const noexcept;
Returns: error_condition(ev, *this).
virtual bool equivalent(int code, const error_condition& condition) const noexcept;
Returns: default_error_condition(code) == condition.
virtual bool equivalent(const error_code& code, int condition) const noexcept;
Returns: *this == code.category() && code.value() == condition.
virtual string message(int ev) const = 0;
Returns: A string that describes the error condition denoted by ev.
bool operator=(const error_category& rhs) const noexcept;
Returns: this == &rhs.
strong_ordering operator<=>(const error_category& rhs) const noexcept;
Returns: compare_three_way()(this, &rhs).
[Note 1: 
compare_three_way ([comparisons.three.way]) provides a total ordering for pointers.
— end note]

19.5.3.4 Program-defined classes derived from error_category [syserr.errcat.derived]

virtual const char* name() const noexcept = 0;
Returns: A string naming the error category.
virtual error_condition default_error_condition(int ev) const noexcept;
Returns: An object of type error_condition that corresponds to ev.
virtual bool equivalent(int code, const error_condition& condition) const noexcept;
Returns: true if, for the category of error represented by *this, code is considered equivalent to condition; otherwise, false.
virtual bool equivalent(const error_code& code, int condition) const noexcept;
Returns: true if, for the category of error represented by *this, code is considered equivalent to condition; otherwise, false.

19.5.3.5 Error category objects [syserr.errcat.objects]

const error_category& generic_category() noexcept;
Remarks: The object's default_error_condition and equivalent virtual functions shall behave as specified for the class error_category.
The object's name virtual function shall return a pointer to the string "generic".
const error_category& system_category() noexcept;
Remarks: The object's equivalent virtual functions shall behave as specified for class error_category.
The object's name virtual function shall return a pointer to the string "system".
The object's default_error_condition virtual function shall behave as follows:
If the argument ev is equal to 0, the function returns error_condition(0, generic_category().
Otherwise, if ev corresponds to a POSIX errno value pxv, the function returns error_condition(pxv, generic_category().
Otherwise, the function returns error_condition(ev, system_category().
What constitutes correspondence for any given operating system is unspecified.
[Note 1: 
The number of potential system error codes is large and unbounded, and some might not correspond to any POSIX errno value.
Thus implementations are given latitude in determining correspondence.
— end note]

19.5.4 Class error_code [syserr.errcode]

The class error_code describes an object used to hold error code values, such as those originating from the operating system or other low-level application program interfaces.
[Note 1: 
Class error_code is an adjunct to error reporting by exception.
— end note]
namespace std { class error_code { public: / [syserr.errcode.constructors], constructors error_code() noexcept; error_code(int val, const error_category& cat) noexcept; template<class ErrorCodeEnum> error_code(ErrorCodeEnum e) noexcept; / [syserr.errcode.modifiers], modifiers void assign(int val, const error_category& cat) noexcept; template<class ErrorCodeEnum> error_code& operator=(ErrorCodeEnum e) noexcept; void clear() noexcept; / [syserr.errcode.observers], observers int value() const noexcept; const error_category& category() const noexcept; error_condition default_error_condition() const noexcept; string message() const; explicit operator bool() const noexcept; private: int val_; / exposition only const error_category* cat_; / exposition only }; / [syserr.errcode.nonmembers], non-member functions error_code make_error_code(errc e) noexcept; template<class charT, class traits> basic_ostream<charT, traits>& operator<(basic_ostream<charT, traits>& os, const error_code& ec); }
error_code() noexcept;
Effects: Initializes val_ with 0 and cat_ with &system_category().
error_code(int val, const error_category& cat) noexcept;
Effects: Initializes val_ with val and cat_ with &cat.
template<class ErrorCodeEnum> error_code(ErrorCodeEnum e) noexcept;
Effects: Equivalent to: error_code ec = make_error_code(e); assign(ec.value(), ec.category();
void assign(int val, const error_category& cat) noexcept;
Postconditions: val_ == val and cat_ == &cat.
template<class ErrorCodeEnum> error_code& operator=(ErrorCodeEnum e) noexcept;
Effects: Equivalent to: error_code ec = make_error_code(e); assign(ec.value(), ec.category();
Returns: *this.
void clear() noexcept;
Postconditions: value() == 0 and category() == system_category().
int value() const noexcept;
Returns: val_.
const error_category& category() const noexcept;
Returns: *cat_.
error_condition default_error_condition() const noexcept;
Returns: category().default_error_condition(value().
string message() const;
Returns: category().message(value().
explicit operator bool() const noexcept;
Returns: value() != 0.
error_code make_error_code(errc e) noexcept;
Returns: error_code(static_cast<int>(e), generic_category().
template<class charT, class traits> basic_ostream<charT, traits>& operator<(basic_ostream<charT, traits>& os, const error_code& ec);
The class error_condition describes an object used to hold values identifying error conditions.
[Note 1: 
error_condition values are portable abstractions, while error_code values ([syserr.errcode]) are implementation specific.
— end note]
namespace std { class error_condition { public: / [syserr.errcondition.constructors], constructors error_condition() noexcept; error_condition(int val, const error_category& cat) noexcept; template<class ErrorConditionEnum> error_condition(ErrorConditionEnum e) noexcept; / [syserr.errcondition.modifiers], modifiers void assign(int val, const error_category& cat) noexcept; template<class ErrorConditionEnum> error_condition& operator=(ErrorConditionEnum e) noexcept; void clear() noexcept; / [syserr.errcondition.observers], observers int value() const noexcept; const error_category& category() const noexcept; string message() const; explicit operator bool() const noexcept; private: int val_; / exposition only const error_category* cat_; / exposition only }; }
error_condition() noexcept;
Effects: Initializes val_ with 0 and cat_ with &generic_category().
error_condition(int val, const error_category& cat) noexcept;
Effects: Initializes val_ with val and cat_ with &cat.
template<class ErrorConditionEnum> error_condition(ErrorConditionEnum e) noexcept;
Effects: Equivalent to: error_condition ec = make_error_condition(e); assign(ec.value(), ec.category();
void assign(int val, const error_category& cat) noexcept;
Postconditions: val_ == val and cat_ == &cat.
template<class ErrorConditionEnum> error_condition& operator=(ErrorConditionEnum e) noexcept;
Effects: Equivalent to: error_condition ec = make_error_condition(e); assign(ec.value(), ec.category();
Returns: *this.
void clear() noexcept;
Postconditions: value() == 0 and category() == generic_category().
int value() const noexcept;
Returns: val_.
const error_category& category() const noexcept;
Returns: *cat_.
string message() const;
Returns: category().message(value().
explicit operator bool() const noexcept;
Returns: value() != 0.
error_condition make_error_condition(errc e) noexcept;
Returns: error_condition(static_cast<int>(e), generic_category().

19.5.6 Comparison operator functions [syserr.compare]

bool operator=(const error_code& lhs, const error_code& rhs) noexcept;
Returns: lhs.category() == rhs.category() && lhs.value() == rhs.value()
bool operator=(const error_code& lhs, const error_condition& rhs) noexcept;
Returns: lhs.category().equivalent(lhs.value(), rhs) || rhs.category().equivalent(lhs, rhs.value()
bool operator=(const error_condition& lhs, const error_condition& rhs) noexcept;
Returns: lhs.category() == rhs.category() && lhs.value() == rhs.value()
strong_ordering operator<=>(const error_code& lhs, const error_code& rhs) noexcept;
Effects: Equivalent to: if (auto c = lhs.category() <=> rhs.category(); c != 0) return c; return lhs.value() <=> rhs.value();
strong_ordering operator<=>(const error_condition& lhs, const error_condition& rhs) noexcept;
Returns: if (auto c = lhs.category() <=> rhs.category(); c != 0) return c; return lhs.value() <=> rhs.value();

19.5.7 System error hash support [syserr.hash]

template<> struct hash<error_code>; template<> struct hash<error_condition>;
The class system_error describes an exception object used to report error conditions that have an associated error code.
Such error conditions typically originate from the operating system or other low-level application program interfaces.
[Note 1: 
If an error represents an out-of-memory condition, implementations are encouraged to throw an exception object of type bad_alloc rather than system_error.
— end note]
namespace std { class system_error : public runtime_error { public: system_error(error_code ec, const string& what_arg); system_error(error_code ec, const char* what_arg); system_error(error_code ec); system_error(int ev, const error_category& ecat, const string& what_arg); system_error(int ev, const error_category& ecat, const char* what_arg); system_error(int ev, const error_category& ecat); const error_code& code() const noexcept; const char* what() const noexcept override; }; }
system_error(error_code ec, const string& what_arg);
Postconditions: code() == ec and
string_view(what().find(what_arg.c_str() != string_view​::​npos.
system_error(error_code ec, const char* what_arg);
Postconditions: code() == ec and string_view(what().find(what_arg) != string_view​::​npos.
system_error(error_code ec);
Postconditions: code() == ec.
system_error(int ev, const error_category& ecat, const string& what_arg);
Postconditions: code() == error_code(ev, ecat) and
string_view(what().find(what_arg.c_str() != string_view​::​npos.
system_error(int ev, const error_category& ecat, const char* what_arg);
Postconditions: code() == error_code(ev, ecat) and
string_view(what().find(what_arg) != string_view​::​npos.
system_error(int ev, const error_category& ecat);
Postconditions: code() == error_code(ev, ecat).
const error_code& code() const noexcept;
Returns: ec or error_code(ev, ecat), from the constructor, as appropriate.
const char* what() const noexcept override;
Returns: An ntbs incorporating the arguments supplied in the constructor.
[Note 1: 
The returned ntbs might be the contents of what_arg + ": " + code.message().
— end note]

Follow Lee on X/Twitter - Father, Husband, Serial builder creating AI, crypto, games & web tools. We are friends :) AI Will Come To Life!

Check out: eBank.nz (Art Generator) | Netwrck.com (AI Tools) | Text-Generator.io (AI API) | BitBank.nz (Crypto AI) | ReadingTime (Kids Reading) | RewordGame | BigMultiplayerChess | WebFiddle | How.nz | Helix AI Assistant