【问题标题】:C error handling: if error return int code else value?C错误处理:如果错误返回int代码其他值?
【发布时间】:2021-05-16 09:15:42
【问题描述】:

在 Go 中,他们经常做整个 (err, val) 的事情,在 Rust 中他们做类似的事情(+ 语法糖)。

我不确定是否应该为我的每种类型使用这种类型的struct

typedef struct {
    int status;
    char *const *c_str_arr;
    size_t size;
} StatusAndArrayCStrArray;

extern void cleanup_struct_cstr_array(StatusAndArrayCStrArray *status_and_array) {
    if (status_and_array->c_str_arr != NULL) {
        free((void *) status_and_array->c_str_arr);
        status_and_array->size = 0;
    }
}

static const StatusAndArrayCStrArray statusAndArrayCStrArrayNull = {
    EXIT_FAILURE, NULL, 0
};

这似乎浪费了很多空间。也许union 会更好? - 我也看到了一些perror 的东西,所以也许我打算设置一个错误代码并返回值,然后首先检查是否有错误,否则 perror 方式返回值?

相关:Error handling in C code

【问题讨论】:

  • 所以我计划从远程服务器返回几千个函数,每个函数返回值或错误。该值可以是标量、某个描述的数组(具有单独的大小字段),也可以是代表远程实体的 struct 上的完整值。
  • 不相关,但为了它的价值,无需将free 的参数或返回值转换为void *malloc/calloc/realloc 也是如此)。

标签: c error-handling optional error-code error-checking


【解决方案1】:
  1. 据我了解,c_str_arr 保留了错误消息。它不必是该结构的一部分。它不必驻留在 RAM 中(如果 RAM 是一个问题 - 例如 uC 编程)。在 .rodata 中有第二个包含错误消息的数组。

  2. size 可能是消息字符串的长度。如果消息字符串是空字符终止的 C 字符串,则您根本不需要。我认为这里不需要动态分配。

  3. 最终您只需要状态码,不需要其他任何东西。

  4. extern void cleanup_struct_cstr_array 函数根据定义是外部函数,您不需要 extern 关键字

编辑(OP 评论):

所以我计划创建几千个函数,每个函数都返回 来自远程服务器的值或错误。

如果服务器将返回带有一些有效负载的完整消息,您不能使用指向该数据的指针,您需要将数据嵌入到消息中。

typedef struct {
    int status;
    size_t payload_size;
    char   payload[];
} StatusAndArrayCStrArray;

payload 将是从服务器返回的数据。它可以是错误消息或其他数据。也可以什么都不是。

最终,如果两个大小都知道有效负载的大小(因为它是根据状态以某种方式定义的),您可能根本不需要 payload_size 成员。

【讨论】:

  • 我更多地认为c_str_arr 是用于当返回值为 c_str_arr 而不是错误时,否则只返回错误代码。我将 int error 重命名为 int status 并一直在使用 status = EXIT_SUCCESS 并检查它。但这一切似乎都相当笨拙……
  • 所以基本上如果我所有的函数都返回StatusAndArrayCStrArray 那么这不是我想的糟糕的设计吗?
猜你喜欢
  • 2020-07-11
  • 2018-04-02
  • 2013-01-30
  • 2011-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 1970-01-01
相关资源
最近更新 更多