在创建模块的过程中,我面临一个两难选择:每个类是否应该在内部定义自己的错误代码,还是应该定义模块范围的错误代码?
到目前为止,优点和缺点是相辅相成的,但我倾向于定义每类错误:
1:
class MyClass
{
public:
typedef enum _TResult {
EOk = 0,
EErrNoMemory,
EErrBadParam,
<...>
} TResult;
TResult DoSomething();
};
与以下内容相反:
2-1:
#define OK (0)
#define ERR_NO_MEMORY (1)
#define ERR_BAD_PARAM (2)
或者:
2-2:
typedef enum _TResult
{
EOk,
EErrNoMemory,
EErrBadParam,
<...>
EErrTimeOut,
EErrFeedThePenguin
} TResult;
根据您的经验,对于任何方法都会有什么问题?
答案 0 :(得分:3)
我对每类错误代码所评论的一件事是,由于相同代码意味着不同,您无法编写单个错误记录器(或至少不容易)取决于班级的事情。
那就是说,你可以随时使用两者。有一个常见错误的全局枚举:
enum GlobalErrors {
EOk = 0,
EErrOutOfMemory,
// etc.
EFreeErrorCodeBase
};
然后在课程中你可以:
class Something {
enum ClassErrors {
EErrCantInitialize = EFreeErrorCodeBase,
EErrCorruptedData,
// etc.
};
...
};
它为您提供了全局错误代码的位置,并确保您的类错误代码不会与全局错误重叠(这由编译器维护)。
答案 1 :(得分:0)
我认为这取决于您希望用户如何使用该系统。如果您有对多个类有意义的错误代码,那么将它们置于“全局”级别,以一种组织良好的格式(例如,按概念分组的错误代码)是有意义的。如果您的类都返回自己的自定义错误代码,我会在类级别更多地定义它们。
答案 2 :(得分:0)
如果您需要来自其他类的相同错误代码,请单独定义它们。你需要做一点提前计划。您现在可能不需要它们,但是您可能在将来创建一个需要类似或相同错误代码的类。
否则,最好将它们放在同一个类中。这将有助于维护源代码和错误代码。它也会使阅读和理解代码变得更容易。
答案 3 :(得分:0)
我认为在类外部存在的有意义的命名状态代码枚举是一个不错的选择。通过这种方式,他们可以根据自己的地位来讲话,而不是实施一个无疑会发生变化的课程或者其职责可能会扩展到一个以上的课程。
typedef enum _DatabaseErrorCodes {
ConnectionFailure = 0,
Timeout,
InvalidParameters
} DatabaseErrorCodes;
typedef enum _CommonErrorCodes {
NullArgument = 0,
SystemOutOfMemory,
FeedThePenguin
} CommonErrorCodes;
课程太流动,容易改变。将错误代码绑定到特定类似乎是一种没有任何明显优势的耦合。我认为(理想情况下)状态代码应该能够独立存在并具有意义。