c++有两个预定义的error_category
对象:generic_category()
和system_category()
。根据我目前的理解,system_category()
应该用于操作系统返回的错误,generic_category()
应该用于std::errc
中找到的通用值,这些值对应于errno
的值。
errno
值是操作系统返回的错误,应该怎么做呢?我应该使用system_category()
(这在非类unix系统上是错误的,需要#ifdef
),还是应该使用generic_category()
(这在类unix系统上对于非标准errno
值是错误的)? 您应该使用system_category()
作为c++标准库函数来报告来自操作系统(任何操作系统,包括基于posix的操作系统,如Unix)的错误-请参阅下面的c++ 11标准引用:
17.6.5.14错误码值[Value .error.codes]
c++标准库中的某些函数通过std::error_code(19.5.2.1)对象报告错误。,对象的category()成员应该返回std::system_category()system,或者是对错误产生的实现定义的error_category对象的引用其他地方。实现应该为每个错误类别定义value()的可能值。[示例:对于基于POSIX的操作系统,鼓励实现定义std::system_category()值与POSIX errno值相同,并带有定义的附加值通过操作系统的文档。非基于的操作系统的实现鼓励在POSIX上定义与操作系统值相同的值。对于这样的错误不是来自操作系统,实现可以为相关值提供枚举。-end example]
您不应该使用system_category
,除非您实际上是操作系统(或报告来自操作系统特定函数的错误)。该类别描述了错误的来源,而不一定是错误代码的含义。因此,system_category
的可能错误代码集与generic_category
相同是完全合法的。