error_code: 如何设置和查看errno
error_code: how to set and check errno
我正在尝试了解在调用在 Linux 上设置 errno
的 C 函数时我应该使用哪个类别。
我不确定所有可能的错误代码都由 POSIX 定义,所以我很想使用 system_category
.
但我想稍后在我的代码中处理通用条件,所以我想做这样的事情:
std::error_code ec;
some_func(some_path, ec);
if (ec) {
if (ec == std::errc::file_exists) {
// special handling
}
return ec;
}
要在 some_func()
中设置错误代码,我希望这样进行:
ec.assign(EEXIST, std::system_category());
主要基于此讨论:
- @niall-douglas 提供的代码示例:
std::error_code ec;
if(-1 == open(...))
ec = std::error_code(errno, std::system_category());
// To test using portable code
if(ec == std::errc::no_such_file_or_directory)
...
// To convert into nearest portable error condition (lossy, may fail)
std::error_condition ec2(ec.default_error_condition())
--
但是,在 Linux 上,使用 GCC 6.1.1,我有:
std::error_code(EEXIST, std::system_category()) == std::errc::file_exists
returns false
std::error_code(EEXIST, std::generic_category()) == std::errc::file_exists
returns true
我期待 errno + system_category 与 std::errc
条件相当。
这意味着如果我不使用通用类别,我检查 if (ec == std::errc::file_exists)
的初始代码将不起作用。
这是预期的行为吗?
这是最近在最新的 GCC 6、7 和 8 点版本中修复的错误。如果您使用的是最新的小版本,它将按您预期的那样工作。参见 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60555。
我正在尝试了解在调用在 Linux 上设置 errno
的 C 函数时我应该使用哪个类别。
我不确定所有可能的错误代码都由 POSIX 定义,所以我很想使用 system_category
.
但我想稍后在我的代码中处理通用条件,所以我想做这样的事情:
std::error_code ec;
some_func(some_path, ec);
if (ec) {
if (ec == std::errc::file_exists) {
// special handling
}
return ec;
}
要在 some_func()
中设置错误代码,我希望这样进行:
ec.assign(EEXIST, std::system_category());
主要基于此讨论:
- @niall-douglas 提供的代码示例:
std::error_code ec; if(-1 == open(...)) ec = std::error_code(errno, std::system_category()); // To test using portable code if(ec == std::errc::no_such_file_or_directory) ... // To convert into nearest portable error condition (lossy, may fail) std::error_condition ec2(ec.default_error_condition())
--
但是,在 Linux 上,使用 GCC 6.1.1,我有:
std::error_code(EEXIST, std::system_category()) == std::errc::file_exists
returnsfalse
std::error_code(EEXIST, std::generic_category()) == std::errc::file_exists
returnstrue
我期待 errno + system_category 与 std::errc
条件相当。
这意味着如果我不使用通用类别,我检查 if (ec == std::errc::file_exists)
的初始代码将不起作用。
这是预期的行为吗?
这是最近在最新的 GCC 6、7 和 8 点版本中修复的错误。如果您使用的是最新的小版本,它将按您预期的那样工作。参见 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60555。