这更多的是一个美学问题,而不是一个纯粹的功能问题,但我想知道是否有任何答案。看,我正在为最近开始的一个项目编写一个错误报告器,它主要是基于代码的,以便于函数使用。想想
errno
,定义了各种值来记录特定问题。这是错误处理程序中流行的系统。但是,我不想只给用户一个代码,因为从开始编程之前我就知道,在尝试自我诊断问题时,随机的数字数组通常会让人不知所措。
我想给他们代码的字符串表示形式。但是,我想不出一种实用的方法来做到这一点。 stringify (
#
) 宏不起作用,因为发送到该函数的错误代码在编译时未知。 除了大开关之外,还有什么可以解决这个问题吗?
对于上下文,这是我的小错误记录器;这是错误管道的最后一步,如果程序到达这里,则发生致命错误。
// Notes: We don't do a lot of error-checking in this function, beyond
// the stuff built into PushNotification. The reason for that is
// fairly simple; at this point, we don't give a darn. If the program
// gets here, something's irreversibly wrong regardless.
// Last edit: July 3rd, 2024
_Noreturn void InternalLogError(const char* caller, const char* file, u32 line,
u32 code)
{
char error_message[128];
// This is the place in which I want to add the code-to-string bit.
snprintf(error_message, 128,
"\nMemphim failed catastrophically.\n"
"Code: %d.\nCaller: %s @ %s\nLine: %d\n",
code, caller, file, line);
if (CheckShellAvailability()) puts(error_message);
else PushNotification("Memphim Error Reporter", error_message);
exit(EXIT_FAILURE);
}
字符串查找表是一种显而易见的方法。
typedef enum
{
ERR_NONE,
ERR_SERVERS_ON_FIRE,
ERR_LIVE_BEAVERS,
ERR_N // total number of supported errors
} err_t;
static const char* err_str[] =
{
[ERR_NONE] = "No error",
[ERR_SERVERS_ON_FIRE] = "The servers are on fire",
[ERR_LIVE_BEAVERS] = "Live beavers in the server room",
};
static_assert(sizeof(err_str)/sizeof(*err_str) == ERR_N,
"err_t and err_str are not consistent with each other");
...
void InternalLogError(..., err_t code)
{
puts(err_str[code]);
}