242 lines
8.8 KiB
Markdown
242 lines
8.8 KiB
Markdown
[syserr.errcat]
|
||
|
||
# 19 Diagnostics library [[diagnostics]](./#diagnostics)
|
||
|
||
## 19.5 System error support [[syserr]](syserr#errcat)
|
||
|
||
### 19.5.3 Class error_category [syserr.errcat]
|
||
|
||
#### [19.5.3.1](#overview) Overview [[syserr.errcat.overview]](syserr.errcat.overview)
|
||
|
||
[1](#overview-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/diagnostics.tex#L783)
|
||
|
||
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[.](#overview-1.sentence-1)
|
||
|
||
Classes may be derived from error_category to support
|
||
categories of errors in addition to those defined in this document[.](#overview-1.sentence-2)
|
||
|
||
Such classes shall behave as specified in subclause [syserr.errcat][.](#overview-1.sentence-3)
|
||
|
||
[*Note [1](#overview-note-1)*:
|
||
|
||
error_category objects are
|
||
passed by reference, and two such objects
|
||
are equal if they have the same address[.](#overview-1.sentence-4)
|
||
|
||
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[.](#overview-1.sentence-5)
|
||
|
||
â *end note*]
|
||
|
||
[ð](#lib:error_category)
|
||
|
||
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](#lib:generic_category "19.5.3.5 Error category objects [syserr.errcat.objects]")() noexcept; const error_category& [system_category](#lib:system_category "19.5.3.5 Error category objects [syserr.errcat.objects]")() noexcept;}
|
||
|
||
#### [19.5.3.2](#virtuals) Virtual members [[syserr.errcat.virtuals]](syserr.errcat.virtuals)
|
||
|
||
[ð](#lib:name,error_category)
|
||
|
||
`virtual const char* name() const noexcept = 0;
|
||
`
|
||
|
||
[1](#virtuals-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/diagnostics.tex#L832)
|
||
|
||
*Returns*: A string naming the error category[.](#virtuals-1.sentence-1)
|
||
|
||
[ð](#lib:default_error_condition,error_category)
|
||
|
||
`virtual error_condition default_error_condition(int ev) const noexcept;
|
||
`
|
||
|
||
[2](#virtuals-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/diagnostics.tex#L843)
|
||
|
||
*Returns*: error_condition(ev, *this)[.](#virtuals-2.sentence-1)
|
||
|
||
[ð](#lib:equivalent,error_category)
|
||
|
||
`virtual bool equivalent(int code, const error_condition& condition) const noexcept;
|
||
`
|
||
|
||
[3](#virtuals-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/diagnostics.tex#L854)
|
||
|
||
*Returns*: default_error_condition(code) == condition[.](#virtuals-3.sentence-1)
|
||
|
||
[ð](#lib:equivalent,error_category_)
|
||
|
||
`virtual bool equivalent(const error_code& code, int condition) const noexcept;
|
||
`
|
||
|
||
[4](#virtuals-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/diagnostics.tex#L865)
|
||
|
||
*Returns*: *this == code.category() && code.value() == condition[.](#virtuals-4.sentence-1)
|
||
|
||
[ð](#lib:message,error_category)
|
||
|
||
`virtual string message(int ev) const = 0;
|
||
`
|
||
|
||
[5](#virtuals-5)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/diagnostics.tex#L876)
|
||
|
||
*Returns*: A string that describes the error condition denoted by ev[.](#virtuals-5.sentence-1)
|
||
|
||
#### [19.5.3.3](#nonvirtuals) Non-virtual members [[syserr.errcat.nonvirtuals]](syserr.errcat.nonvirtuals)
|
||
|
||
[ð](#lib:operator==,error_category)
|
||
|
||
`bool operator==(const error_category& rhs) const noexcept;
|
||
`
|
||
|
||
[1](#nonvirtuals-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/diagnostics.tex#L889)
|
||
|
||
*Returns*: this == &rhs[.](#nonvirtuals-1.sentence-1)
|
||
|
||
[ð](#lib:operator%3c=%3e,error_category)
|
||
|
||
`strong_ordering operator<=>(const error_category& rhs) const noexcept;
|
||
`
|
||
|
||
[2](#nonvirtuals-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/diagnostics.tex#L900)
|
||
|
||
*Returns*: compare_three_way()(this, &rhs)[.](#nonvirtuals-2.sentence-1)
|
||
|
||
[*Note [1](#nonvirtuals-note-1)*:
|
||
|
||
compare_three_way ([[comparisons.three.way]](comparisons.three.way "22.10.8.8 Class compare_three_way")) provides a total ordering for pointers[.](#nonvirtuals-2.sentence-2)
|
||
|
||
â *end note*]
|
||
|
||
#### [19.5.3.4](#derived) Program-defined classes derived from error_category [[syserr.errcat.derived]](syserr.errcat.derived)
|
||
|
||
[ð](#lib:name,error_category_)
|
||
|
||
`virtual const char* name() const noexcept = 0;
|
||
`
|
||
|
||
[1](#derived-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/diagnostics.tex#L917)
|
||
|
||
*Returns*: A string naming the error category[.](#derived-1.sentence-1)
|
||
|
||
[ð](#lib:default_error_condition,error_category_)
|
||
|
||
`virtual error_condition default_error_condition(int ev) const noexcept;
|
||
`
|
||
|
||
[2](#derived-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/diagnostics.tex#L928)
|
||
|
||
*Returns*: An object of type error_condition that corresponds to ev[.](#derived-2.sentence-1)
|
||
|
||
[ð](#lib:equivalent,error_category__)
|
||
|
||
`virtual bool equivalent(int code, const error_condition& condition) const noexcept;
|
||
`
|
||
|
||
[3](#derived-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/diagnostics.tex#L939)
|
||
|
||
*Returns*: true if, for the category of error represented by *this, code is considered equivalent to condition; otherwise, false[.](#derived-3.sentence-1)
|
||
|
||
[ð](#lib:equivalent,error_category___)
|
||
|
||
`virtual bool equivalent(const error_code& code, int condition) const noexcept;
|
||
`
|
||
|
||
[4](#derived-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/diagnostics.tex#L950)
|
||
|
||
*Returns*: true if, for the category of error represented by *this, code is considered equivalent to condition; otherwise, false[.](#derived-4.sentence-1)
|
||
|
||
#### [19.5.3.5](#objects) Error category objects [[syserr.errcat.objects]](syserr.errcat.objects)
|
||
|
||
[ð](#lib:generic_category_)
|
||
|
||
`const error_category& generic_category() noexcept;
|
||
`
|
||
|
||
[1](#objects-1)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/diagnostics.tex#L963)
|
||
|
||
*Returns*: A reference to an object of a type derived from class error_category[.](#objects-1.sentence-1)
|
||
|
||
All calls to this function shall return references to the same object[.](#objects-1.sentence-2)
|
||
|
||
[2](#objects-2)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/diagnostics.tex#L968)
|
||
|
||
*Remarks*: The object's default_error_condition and equivalent virtual functions shall behave as specified for the class error_category[.](#objects-2.sentence-1)
|
||
|
||
The object's name virtual function shall return a pointer to the string "generic"[.](#objects-2.sentence-2)
|
||
|
||
[ð](#lib:system_category_)
|
||
|
||
`const error_category& system_category() noexcept;
|
||
`
|
||
|
||
[3](#objects-3)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/diagnostics.tex#L979)
|
||
|
||
*Returns*: A reference to an object of a type derived from class error_category[.](#objects-3.sentence-1)
|
||
|
||
All calls to this function shall return references to the same object[.](#objects-3.sentence-2)
|
||
|
||
[4](#objects-4)
|
||
|
||
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/diagnostics.tex#L984)
|
||
|
||
*Remarks*: The object's equivalent virtual functions shall behave as specified for
|
||
class error_category[.](#objects-4.sentence-1)
|
||
|
||
The object's name virtual function shall return a
|
||
pointer to the string "system"[.](#objects-4.sentence-2)
|
||
|
||
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())[.](#objects-4.sentence-4)
|
||
|
||
Otherwise,
|
||
if ev corresponds to a POSIX errno value pxv,
|
||
the function returns error_condition(pxv, generic_category())[.](#objects-4.sentence-5)
|
||
|
||
Otherwise, the function returns error_condition(ev, system_category())[.](#objects-4.sentence-6)
|
||
|
||
What constitutes correspondence for any given operating system is unspecified[.](#objects-4.sentence-7)
|
||
|
||
[*Note [1](#objects-note-1)*:
|
||
|
||
The number of potential system error codes is large
|
||
and unbounded, and some might not correspond to any POSIX errno value[.](#objects-4.sentence-8)
|
||
|
||
Thus
|
||
implementations are given latitude in determining correspondence[.](#objects-4.sentence-9)
|
||
|
||
â *end note*]
|