【发布时间】: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检索到的错误描述初始化基础 -
@kreuzerkrieg 请看这个:open-std.org/jtc1/sc22/wg21/docs/papers/2018/p0709r0.pdf
标签: c++ error-handling error-code