我想知道在C ++中处理静态错误字符串的最佳方法是什么。我目前正在使用一些常量的char指针,但它们变得笨拙,并且它们散布在我的代码中的每个位置。我也应该为这些字符串使用静态常量字符指针吗?
我正在考虑使用SimpleIni类进行跨平台兼容性的定义,哈希表和INI文件。该项目是一个始终运行的Web服务器。
我想使用错误号或名称来逻辑地引用它们。
如果有帮助的话,我正在使用命名空间类中包含的全局空间和方法。如果有帮助,代码将导出到C环境。
由于
答案 0 :(得分:2)
首先,您可以在stackoverflow上查看其他相关问题。在这里你有一些:
然后看一下关于错误处理的这个伟大的tutorial(这是一个五部分教程,但你可以从该链接访问所有这些)。如果您使用的是C ++ 11,这一点尤为有趣,因为它提供了许多错误处理功能。或者,如果您不能使用C ++ 11,则可以使用boost。
您还需要考虑是否要包含对本地化的支持。如果您的应用程序可能以不同语言向用户显示消息,那么最好从错误管理的一开始就包含该要求。例如,您可以检查Boost.Locale。
答案 1 :(得分:2)
这里有几件紧张的事情,所以请让我列举一下:
一般来说,我看到的最简单的事情是使用一些整数常量来识别错误,然后在一侧有一个表,您可以在其中检索其他信息(可能很多)。例如,Clang使用该系统进行诊断。您可以通过使用预处理器来避免重复自己。
使用这样的标题:
#define MYMODULE_ERROR_LIST \
ERROR(Code, "description") \
...
#define ERROR(Code, Desc) Code,
class enum ErrorCode: unsigned {
MYMODULE_ERROR_List
NumberOfElements
};
#undef ERROR
struct Error {
ErrorCode code;
char const* description;
};
Error const& error(ErrorCode ec);
一个简单的源文件来定位数组:
#define ERROR(Code, Desc) { Code, Desc },
Error const ErrorsArray[] = {
MYMODULE_ERROR_LIST
{ErrorCode::NumberOfElements, 0}
};
Error const& error(ErrorCode const ec) {
assert(unsigned(ec) < unsigned(ErrorCode::NumberOfElements) &&
"The error code must have been corrupted.");
return ErrorsArray[ec];
} // error
注意:在标题中定义宏的代价是,描述中措辞的最轻微改变意味着根据枚举重新编译所有代码。就个人而言,我的东西构建速度比测试时快得多,所以我并不在乎。
这是一个非常有效的方案。因为它尊重DRY(不要重复自己),它还确保代码描述映射是准确的。可以调整ERROR
宏以获得更多信息,而不仅仅是描述(类别等)。只要Error
类型is_trivially_constructible
,就可以静态初始化数组,从而避免生命周期问题。
不幸的是,enum
在模块化方面不是很好;并且让每个模块运行自己的enum
在处理错误时很快就会变得无聊(Error
结构可以使用unsigned code;
)。
如果您希望超越中央存储库,则需要更多涉及的机制,但由于它似乎适合您,我将停止提及此限制。
答案 2 :(得分:1)
我会在标题中保持简单:
enum ErrorCode { E_help, E_wtf, E_uhoh };
const char* errstr(ErrorCode);
然后在一些.c
或.cc
文件中:
const char* error_strings[] = {
"help!",
"wtf?",
"uh-oh"
};
const char* errstr(ErrorCode e) { return error_strings[e]; }
答案 3 :(得分:-1)
在您的问题中没有太多细节,但是根据您发布的内容,我会考虑使用单例类来处理您的错误消息。您可以创建按代码或枚举访问消息的方法。然后,您可以实现国际化或您的特定应用所需的任何其他内容。此外,如果您决定在将来使用SQLite或其他基于文件的解决方案,则类接口可以保持不变(或扩展),从而最大限度地减少对其余代码的影响。