【问题标题】:What is the preferred way to return error? [closed]返回错误的首选方式是什么? [关闭]
【发布时间】:2019-04-20 17:01:57
【问题描述】:

我一直坚持为我的库的公共 API 中的函数提供错误处理工具。例如我有一些data_source 和一个queue,函数是get_data,目前看起来像:

typedef struct data_source data_source;

typedef struct queue queue;

/**
 * Returns:
 *  0 - on success
 * -1 - on data source failure
 * -2 - on queue overflow
 */
int get_data(data_source *ds, queue *queue);

但是查看POSIX 的errno 方法,他们使用返回类型来指示发生了一些错误,并使用errno 来设置错误代码。我不确定为我的库 API 使用 errno 是否是一个不错的选择,但考虑到这个想法,我将设计函数如下:

/**
 * Returns:
 *  0 - on success
 * -1 - on error and error_code is set to
 *      1 - if queue overflow occurs
 *      2 - if data source failure detected
 */
int get_data(data_source *ds, queue *queue, int *error_code);

第二个示例是不是(常见 | 比第一个更受欢迎)用于错误处理的 C 方法?

【问题讨论】:

  • 有什么理由不能简单地抛出异常吗?
  • out 参数error_code 是一个很好的方法来返回错误恕我直言。比如看看 Windows COM implements 是如何处理错误的。这样,您的函数签名根本不会与错误处理耦合。您可以随心所欲地方便地返回值,但仍要实现错误检查机制。
  • @WeatherVane 这就是我要问的。在第一个示例中,我使用了返回值,但在libc 中,函数的返回类型为int,即-10,错误代码设置为errno。所以我认为错误代码使用out参数更常见。
  • 第二个接口将是一个更一致的接口,因为返回值可能已经以不同的方式从不同的函数中给出了多个值。

标签: c error-handling api-design


【解决方案1】:

errno 是 errno.h 中的一个宏。

将其视为系统或库可能设置的外部 int。 IE。它不是你的 lib 函数的参数,而是一个全局 int。

是否要将返回值用作错误代码或使用 errno 完全取决于您。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-10
    • 2013-05-21
    • 1970-01-01
    相关资源
    最近更新 更多