C 返回错误的首选方法是什么?
我一直致力于为库的公共API中的函数提供错误处理工具。例如,我有一些C 返回错误的首选方法是什么?,c,error-handling,api-design,C,Error Handling,Api Design,我一直致力于为库的公共API中的函数提供错误处理工具。例如,我有一些数据\u源和一个队列,函数是获取数据,当前看起来如下: 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_sour
数据\u源
和一个队列
,函数是获取数据
,当前看起来如下:
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方法吗(常见的|比第一个更可取?errno是errno.h中的一个宏 将其视为系统或libs可能设置为某个值的外部int。也就是说,它不是lib函数的参数,而是一个全局int
如果要将返回值用作错误代码或使用errno,完全由您决定。errno是errno.h中的宏 将其视为系统或libs可能设置为某个值的外部int。也就是说,它不是lib函数的参数,而是一个全局int
如果要将返回值用作错误代码或使用errno,完全由您决定。是否有理由认为简单地抛出异常是不可行的?out参数
error\u code
是返回错误imho的一个好方法。例如,看看Windows COM如何处理错误。这样,您的函数签名就不会与错误处理耦合在一起。您可以随心所欲地返回值,但仍然可以实现错误检查机制。@WeatherVane这就是我要问的。在第一个示例中,我使用了返回值,但在libc
函数中,返回类型为int
,即-1
或0
,错误代码设置为errno
。因此,我认为在错误代码中使用out参数更为常见。第二个参数将是一个更为一致的接口,因为返回值可能已经以不同的方式从不同的函数中给出了多个值。是否有原因说明简单地抛出异常是不可行的?out参数,error\u code
,是返回错误imho的好方法。例如,看看Windows COM如何处理错误。这样,您的函数签名就不会与错误处理耦合在一起。您可以随心所欲地返回值,但仍然可以实现错误检查机制。@WeatherVane这就是我要问的。在第一个示例中,我使用了返回值,但在libc
函数中,返回类型为int
,即-1
或0
,错误代码设置为errno
。因此,我认为在错误代码中使用out参数更为常见。第二种方法是更为一致的接口,因为返回值可能已经以不同的方式从不同的函数中给出了多个值。