error_code:如何设置和检查错误

error_code: how to set and check errno

本文关键字:设置 检查 错误 code 何设置 error      更新时间:2023-10-16

我试图了解在 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道格拉斯提供的代码示例:
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())

-- https://stackoverflow.com/a/40063005/951426

但是,在Linux上,使用GCC 6.1.1,我有:

  • std::error_code(EEXIST, std::system_category()) == std::errc::file_exists返回false
  • std::error_code(EEXIST, std::generic_category()) == std::errc::file_exists返回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。