【问题标题】:Should I use system_category or generic_category for errno on Unix?我应该在 Unix 上使用 system_category 还是 generic_category 来表示 errno?
【发布时间】:2011-11-24 11:06:40
【问题描述】:

C++0x 有两个预定义的error_category 对象:generic_category()system_category()。据我目前了解,system_category() 应该用于操作系统返回的错误,generic_category() 应该用于std::errc 中找到的通用值,它们对应于errno 值。

但是,在类似 Unix 的系统上应该怎么做,其中errno操作系统返回的错误?我应该使用system_category()(这在非类Unix系统上是错误的,需要#ifdef),还是应该使用generic_category()(对于非标准errno在类Unix系统上是错误的@值)?

【问题讨论】:

  • 阅读完答案后,我仍然不确定该使用什么。
  • @robert: 是一个复杂的、过度设计的混乱。如何正确使用它?没有人知道...(请参阅此线程)。

标签: unix error-handling c++11 errno system-error


【解决方案1】:

您应该像 C++ 标准库函数那样使用 system_category() 报告来自操作系统(任何一个,包括基于 POSIX 的操作系统,例如 Unix)的错误 - 请参阅下面 C++11 标准的引用:

17.6.5.14 错误代码的值 [value.error.codes]

1 C++ 标准库中的某些函数通过 std::error_code (19.5.2.1) 对象报告错误。 那个 对象的 category() 成员应返回 std::system_category() 对于源自操作的错误 system,或对实现定义的 error_category 对象的引用,以获取源自错误的 别处。实现应为这些错误类别中的每一个定义 value() 的可能值。 [ 示例:对于基于 POSIX 的操作系统,鼓励实现定义 std::system_category() 值与 POSIX errno 值相同,附加值已定义 由操作系统的文档。非基于操作系统的实现 鼓励在 POSIX 上定义与操作系统值相同的值。对于错误 如果不是源自操作系统,则实现可以为相关值提供枚举。 —结束示例]

【讨论】:

  • 好吧,“来自操作系统”并不像听起来那么清晰。 errno 来自 Unix 上的 libc(它是操作系统的一部分)。在 Windows 上,errno 来自 C 运行时,它不一定是操作系统的一部分。而且你不能在 Windows 上将system_category 用于errno,因为这应该保留用于本机 Windows 错误。但是,如果您执行 fopen,在这两种情况下您都希望处理 errno 相同。
【解决方案2】:

您不应使用system_category,除非您实际上是操作系统(或从特定于操作系统的函数报告错误)。类别描述了错误的来源,不一定是错误代码的含义。因此,将来自system_category 的一组可能的错误代码与generic_category 相同是完全合法的。

【讨论】:

  • 让我们看看我是否明白:我应该始终使用system_category(),因为errno 值我来自操作系统函数(或来自调用操作系统函数的函数,或从调用函数的函数调用...)。但是在 Win32 上怎么办,因为 system_category() 将用于 GetLastError() 值,而 C 库函数会报告 errno 中的错误?
  • @CesarB - 这听起来与 Nicol Bolas 所写的完全相反。 :) 如果 errno 已经由您调用的函数设置,为什么要搞砸呢?但如果你确实需要弄乱它,Nicol 建议你使用generic_category
  • @Marc:我正在调用一个设置 errno 的函数(例如 epoll_ctlopen),并且我想抛出一个 system_error(包装 errno)以防出错。
猜你喜欢
  • 2023-02-07
  • 2011-09-03
  • 2016-09-30
  • 2013-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
  • 1970-01-01
相关资源
最近更新 更多