将错误代码映射到错误描述

时间:2012-09-14 11:47:21

标签: c error-handling enums

我本来希望在the answer to this question 添加评论,但没有足够的分数。请考虑以下代码:

enum _config_error
{
    E_SUCCESS = 0,
    E_INVALID_INPUT = -1,
    E_FILE_NOT_FOUND = -2, /* consider some way of returning the OS error too */
    ...
};

/* type to provide in your API */
typedef _config_error error_t;

/* use this to provide a perror style method to help consumers out */
struct _errordesc {
    int  code;
    char *message;
} errordesc[] = {
    { E_SUCCESS, "No error" },
    { E_INVALID_INPUT, "Invalid input" },
    { E_FILE_NOT_FOUND, "File not found" },
    ...
};

如何从errordesc查找错误说明?我可以看到我提出的版本有两个问题:

/* add E_COUNT = 3 to enum _config_error */
const char *errorstring(error_t errnum)
{
    unsigned int i;

    for (i = 0; i < E_COUNT; ++i) {
        if (errordesc[i].code == errnum) {
            return errordesc[i].message;
        }

    }

    return "Can't reach this point";
}
  1. 确实知道枚举大小,必须手动将E_COUNT设置为3。
  2. 在for循环之后无法达到回报,该怎么做?
  3. 有更好的解决方案吗?

2 个答案:

答案 0 :(得分:1)

  1. 您可以从E_COUNT计算sizeof(errordesc) / sizeof(struct _errordesc)
  2. 如果您到达循环的末尾,只需返回"Unknown error"或类似内容。
  3. 由于您的错误代码似乎是连续的(但是为负数),您可以使用-errnum直接索引到数组中。

答案 1 :(得分:0)

更好的选择是确保所有错误代码都具有从0开始(或关闭)的连续值。然后,您可以将它们用作errordesc[]的索引。当然,如果它们是否定的,你会做errordesc[-errnum]

之类的事情

至于errordesc[]中的条目数,它是sizeof(errordesc)/sizeof(errordesc[0])。您可以将其存储在全局变量中。

C中还有bsearch()