【问题标题】:c++ custom error-code class or system errnoc++ 自定义错误代码类或系统 errno
【发布时间】:2017-08-22 09:33:45
【问题描述】:

我们正处于一个大型项目的初始阶段,最初要做的事情之一是定义不同模块的错误代码。以前我们使用系统 errno 作为错误代码并使用 strerror() 来打印错误。这非常简单并且工作正常[我们早期的大部分代码都是 C,可能 10% 是 C++]。

在新项目 [完全使用 C++] 中,我很困惑我们是否应该遵循这一点。或者定义我们自己的错误类。

例如:

enum class ErrorCode {

FILE_EXIST = EEXIST,
ACCESS_DENIED = EACCESS,
...
};

const char *error_str (ErrorCode code)
{
    switch (code) {
        case ACCESS_DENIED: return "Access denied";
        ...
    }
}

class Error {
   Error (ErrorCode code) : _code (code){}
   Error() : _code(0){}

   void operator = (ErrorCode code);
   bool operator == (ErrorCode code);
   operator bool() {return _code != 0;}
   const char *string() { return error_str(_code);}

private:
   ErrorCode _code;
};

这只是一个包含一些 C++ 糖的包装类。但是在定义了这一点之后,我认为它不会为 int/strerror() 添加任何值,除了扩展的可能性并且不必要地使事情变得冗长。我猜与 errno 相比,上面的代码并没有增加太多的性能损失,因为它里面只有一个 int。

需要建议 - 根据您在大型 c++ 项目中的经验,进展如何?

【问题讨论】:

  • 为什么不例外?
  • 例外是的.. 但在我们必须使用错误代码的情况下
  • 那时,当我们重写 C++ 服务器并使用 API 返回代码时,我们将其转换为异常。例如,对于 Win32 API,我们使用 FormatMessageA 获取错误描述,然后抛出定义为 class Win32Exception : public std::runtime_error 的 Win32Exception,并使用 FormatMessageA 检索到的错误描述初始化基础

标签: c++ error-handling error-code


【解决方案1】:

看看std::error_code中的system_error,好像做你想做的。 This 是一个很好的关于它如何工作的教程。 This 帖子还详细解释了它应该如何工作。

【讨论】:

猜你喜欢
  • 2022-06-17
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-29
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
相关资源
最近更新 更多