【发布时间】: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,即-1或0,错误代码设置为errno。所以我认为错误代码使用out参数更常见。 -
第二个接口将是一个更一致的接口,因为返回值可能已经以不同的方式从不同的函数中给出了多个值。
标签: c error-handling api-design