Files
2025-10-25 03:02:53 +03:00

37 KiB
Raw Permalink Blame History

[syserr]

19 Diagnostics library [diagnostics]

19.5 System error support [syserr]

19.5.1 General [syserr.general]

1

#

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 oferrno ([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 // 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; templatestruct is_error_code_enum : public false_type {}; templatestruct 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 : 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 functionsbool 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 supporttemplate struct hash; template<> struct hash<error_code>; template<> struct hash<error_condition>; // [syserr], system error supporttemplateconstexpr bool is_error_code_enum_v = is_error_code_enum::value; templateconstexpr bool is_error_condition_enum_v = is_error_condition_enum::value;}

1

#

The value of each enum errc enumerator is the same as the value of the macro shown in the above synopsis.

Whether or not the <system_error> implementation exposes the macros is unspecified.

2

#

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]

19.5.3.1 Overview [syserr.errcat.overview]

1

#

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;}

19.5.3.2 Virtual members [syserr.errcat.virtuals]

🔗

virtual const char* name() const noexcept = 0;

1

#

Returns: A string naming the error category.

🔗

virtual error_condition default_error_condition(int ev) const noexcept;

2

#

Returns: error_condition(ev, *this).

🔗

virtual bool equivalent(int code, const error_condition& condition) const noexcept;

3

#

Returns: default_error_condition(code) == condition.

🔗

virtual bool equivalent(const error_code& code, int condition) const noexcept;

4

#

Returns: *this == code.category() && code.value() == condition.

🔗

virtual string message(int ev) const = 0;

5

#

Returns: A string that describes the error condition denoted by ev.

19.5.3.3 Non-virtual members [syserr.errcat.nonvirtuals]

🔗

bool operator==(const error_category& rhs) const noexcept;

1

#

Returns: this == &rhs.

🔗

strong_ordering operator<=>(const error_category& rhs) const noexcept;

2

#

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;

1

#

Returns: A string naming the error category.

🔗

virtual error_condition default_error_condition(int ev) const noexcept;

2

#

Returns: An object of type error_condition that corresponds to ev.

🔗

virtual bool equivalent(int code, const error_condition& condition) const noexcept;

3

#

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;

4

#

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;

1

#

Returns: A reference to an object of a type derived from class error_category.

All calls to this function shall return references to the same object.

2

#

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;

3

#

Returns: A reference to an object of a type derived from class error_category.

All calls to this function shall return references to the same object.

4

#

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]

19.5.4.1 Overview [syserr.errcode.overview]

1

#

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 error_code(ErrorCodeEnum e) noexcept; // [syserr.errcode.modifiers], modifiersvoid assign(int val, const error_category& cat) noexcept; template error_code& operator=(ErrorCodeEnum e) noexcept; void clear() noexcept; // [syserr.errcode.observers], observersint 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 onlyconst 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);}

19.5.4.2 Constructors [syserr.errcode.constructors]

🔗

error_code() noexcept;

1

#

Effects: Initializes val_ with 0 and cat_ with &system_category().

🔗

error_code(int val, const error_category& cat) noexcept;

2

#

Effects: Initializes val_ with val and cat_ with &cat.

🔗

template<class ErrorCodeEnum> error_code(ErrorCodeEnum e) noexcept;

3

#

Constraints: is_error_code_enum_v is true.

4

#

Effects: Equivalent to:error_code ec = make_error_code(e); assign(ec.value(), ec.category());

19.5.4.3 Modifiers [syserr.errcode.modifiers]

🔗

void assign(int val, const error_category& cat) noexcept;

1

#

Postconditions: val_ == val and cat_ == &cat.

🔗

template<class ErrorCodeEnum> error_code& operator=(ErrorCodeEnum e) noexcept;

2

#

Constraints: is_error_code_enum_v is true.

3

#

Effects: Equivalent to:error_code ec = make_error_code(e); assign(ec.value(), ec.category());

4

#

Returns: *this.

🔗

void clear() noexcept;

5

#

Postconditions: value() == 0 and category() == system_category().

19.5.4.4 Observers [syserr.errcode.observers]

🔗

int value() const noexcept;

1

#

Returns: val_.

🔗

const error_category& category() const noexcept;

2

#

Returns: **cat_*.

🔗

error_condition default_error_condition() const noexcept;

3

#

Returns: category().default_error_condition(value()).

🔗

string message() const;

4

#

Returns: category().message(value()).

🔗

explicit operator bool() const noexcept;

5

#

Returns: value() != 0.

19.5.4.5 Non-member functions [syserr.errcode.nonmembers]

🔗

error_code make_error_code(errc e) noexcept;

1

#

Returns: error_code(static_cast(e), generic_category()).

🔗

template<class charT, class traits> basic_ostream<charT, traits>& operator<<(basic_ostream<charT, traits>& os, const error_code& ec);

2

#

Effects: Equivalent to: return os << ec.category().name() << ':' << ec.value();

19.5.5 Class error_condition [syserr.errcondition]

19.5.5.1 Overview [syserr.errcondition.overview]

1

#

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 error_condition(ErrorConditionEnum e) noexcept; // [syserr.errcondition.modifiers], modifiersvoid assign(int val, const error_category& cat) noexcept; template error_condition& operator=(ErrorConditionEnum e) noexcept; void clear() noexcept; // [syserr.errcondition.observers], observersint value() const noexcept; const error_category& category() const noexcept; string message() const; explicit operator bool() const noexcept; private:int val_; // exposition onlyconst error_category* cat_; // exposition only};}

19.5.5.2 Constructors [syserr.errcondition.constructors]

🔗

error_condition() noexcept;

1

#

Effects: Initializes val_ with 0 and cat_ with &generic_category().

🔗

error_condition(int val, const error_category& cat) noexcept;

2

#

Effects: Initializes val_ with val and cat_ with &cat.

🔗

template<class ErrorConditionEnum> error_condition(ErrorConditionEnum e) noexcept;

3

#

Constraints: is_error_condition_enum_v is true.

4

#

Effects: Equivalent to:error_condition ec = make_error_condition(e); assign(ec.value(), ec.category());

19.5.5.3 Modifiers [syserr.errcondition.modifiers]

🔗

void assign(int val, const error_category& cat) noexcept;

1

#

Postconditions: val_ == val and cat_ == &cat.

🔗

template<class ErrorConditionEnum> error_condition& operator=(ErrorConditionEnum e) noexcept;

2

#

Constraints: is_error_condition_enum_v is true.

3

#

Effects: Equivalent to:error_condition ec = make_error_condition(e); assign(ec.value(), ec.category());

4

#

Returns: *this.

🔗

void clear() noexcept;

5

#

Postconditions: value() == 0 and category() == generic_category().

19.5.5.4 Observers [syserr.errcondition.observers]

🔗

int value() const noexcept;

1

#

Returns: val_.

🔗

const error_category& category() const noexcept;

2

#

Returns: **cat_*.

🔗

string message() const;

3

#

Returns: category().message(value()).

🔗

explicit operator bool() const noexcept;

4

#

Returns: value() != 0.

19.5.5.5 Non-member functions [syserr.errcondition.nonmembers]

🔗

error_condition make_error_condition(errc e) noexcept;

1

#

Returns: error_condition(static_cast(e), generic_category()).

19.5.6 Comparison operator functions [syserr.compare]

🔗

bool operator==(const error_code& lhs, const error_code& rhs) noexcept;

1

#

Returns: lhs.category() == rhs.category() && lhs.value() == rhs.value()

🔗

bool operator==(const error_code& lhs, const error_condition& rhs) noexcept;

2

#

Returns: lhs.category().equivalent(lhs.value(), rhs) || rhs.category().equivalent(lhs, rhs.value())

🔗

bool operator==(const error_condition& lhs, const error_condition& rhs) noexcept;

3

#

Returns: lhs.category() == rhs.category() && lhs.value() == rhs.value()

🔗

strong_ordering operator<=>(const error_code& lhs, const error_code& rhs) noexcept;

4

#

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;

5

#

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>;

1

#

The specializations are enabled ([unord.hash]).

19.5.8 Class system_error [syserr.syserr]

19.5.8.1 Overview [syserr.syserr.overview]

1

#

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.

2

#

[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; };}

19.5.8.2 Members [syserr.syserr.members]

🔗

system_error(error_code ec, const string& what_arg);

1

#

Postconditions: code() == ec and
string_view(what()).find(what_arg.c_str()) != string_view::npos.

🔗

system_error(error_code ec, const char* what_arg);

2

#

Postconditions: code() == ec andstring_view(what()).find(what_arg) != string_view::npos.

🔗

system_error(error_code ec);

3

#

Postconditions: code() == ec.

🔗

system_error(int ev, const error_category& ecat, const string& what_arg);

4

#

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);

5

#

Postconditions: code() == error_code(ev, ecat) and
string_view(what()).find(what_arg) != string_view::npos.

🔗

system_error(int ev, const error_category& ecat);

6

#

Postconditions: code() == error_code(ev, ecat).

🔗

const error_code& code() const noexcept;

7

#

Returns: ec or error_code(ev, ecat), from the constructor, as appropriate.

🔗

const char* what() const noexcept override;

8

#

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]