是否有更好的方法来字符串化错误代码?

问题描述 投票:0回答:1

这更多的是一个美学问题,而不是一个纯粹的功能问题,但我想知道是否有任何答案。看,我正在为最近开始的一个项目编写一个错误报告器,它主要是基于代码的,以便于函数使用。想想

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);
}
c string c11 error-reporting
1个回答
0
投票

字符串查找表是一种显而易见的方法。

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]);
}
© www.soinside.com 2019 - 2024. All rights reserved.