如何将通用错误代码枚举与<system_error>中的system_category错误代码一起使用?

时间:2017-09-22 17:55:29

标签: c++ c++11 exception-handling

我有这个抛出异常的代码(非常类似于what is suggested here):

int accept4(int sockfd, sockaddr *addr, socklen_t *addrlen, int flags)
{
   const int fd = ::accept4(sockfd, addr, addrlen, flags);
   if (fd < 0)
   {
       const auto tmp = errno;
       throw ::std::system_error(tmp, ::std::system_category(), "accept4(2)");
   }
   else
   {
      return fd;
   }
}

此代码用于测试特定的异常原因:

catch (const ::std::system_error &e)
{
   static const auto block_err = ::std::system_error(EWOULDBLOCK,
                                                     ::std::system_category());

   const auto ecode = e.code(); 

   // EWOULBLOCK is fine, everything else, re-throw it.
   if (block_err.code() != ecode)
   {
      throw;
   }
}

这似乎是一种不必要的冗长而且不是正确的做事方式。通用错误的全部概念和整个枚举(参见::std::errc)以及某些系统应该在系统特定的错误代码和这些通用错误之间进行转换。

我想使用通用错误代码和类别,我似乎无法让它们工作。我该如何做到这一点?

1 个答案:

答案 0 :(得分:1)

在足够高质量的 * 的实现上,它就足够了

if (e.code() != std::errc::operation_would_block)
    throw;

如果没有,你会被困在

if (e.code() != std::error_code(EWOULDBLOCK, std::system_category()))
    throw;

当然不需要为内部的错误代码构建另一个system_error

* 需要实施system_category() default_error_condition来将错误正确映射到generic_category()