Разработка открытых кодов ошибок в C для библиотеки - PullRequest
1 голос
/ 21 апреля 2019

Проблема разработки, которую я пытаюсь решить, заключается в том, каким образом клиент может обрабатывать ошибки, которые могут возникнуть при вызове функций библиотеки.Я вижу 2 подхода:

I. Поместить все ошибки, которые могут быть вызваны любыми библиотечными функциями, в публичный отдельный заголовочный файл, например, lib_errors.h:

#define APP_ERR_OBJECT_TOO_SMALL 1 /* The object is too small */

#define APP_ERR_HOST_UNREACHABLE 2 /* Host is not reachable */

#define APP_ERR_UNKNOWN          3 /* Unknown error */

И включить его во все общедоступные заголовочные файлы библиотеки.

header1.h:

#include "lib_errors.h"

/**
 * -1 - on error 
 *      error_code is set to APP_ERR_OBJECT_TOO_SMALL the buf is too small
 *      error_code is set to APP_ERR_UNKNOWN in case of unknown error
 */ 
int hdr1_drain(void *buf, size_t sz, int *error_code);

header2.h:

#include "lib_errors.h"

/**
 * -1 - on error 
 *      error_code is set to APP_ERR_HOST_UNREACHABLE if the host is unreachable
 *      error_code is set to APP_ERR_UNKNOWN in case of unknown error
 */ 
int hdr2_connect(char *add, int *error_code);

Проблема, которую я вижу: Все ошибки, которые может вызвать библиотека, будут включены в каждый из файлов заголовка, даже те, которые сам заголовок не вызывает.

II. Чтобы определить характерные для заголовка ошибки в каждом заголовочном файле:

header1.h:

#define HDR1_OBJECT_TOO_SMALL 1
#define HDR1_UNKNOWN          2

header2.h

#define HDR2_HOST_UNREACHABLE 1
#define HDR2_UNKNOWN          2

Проблема, которую я вижу : Количество дубликатов кода увеличивается с увеличением числа распространенных ошибок.Все распространенные ошибки должны быть продублированы в каждом общедоступном заголовочном файле.

Так что я сейчас не знаю, какой из них выбрать.Вероятно, есть другой способ решения проблемы дизайна.Первый подход кажется ближе к POSIX errno.

1 Ответ

2 голосов
/ 21 апреля 2019

Вы можете объединить два подхода. Поместите все распространенные ошибки в один заголовок, а затем ошибки, связанные с приложением, в заголовок приложения.

lib_errors.h:

#define ERR_UNKNOWN 1
...
#define LIBERR_LAST 100

header1.h:

#include "lib_errors.h"

#define HDR1_OBJECT_TOO_SMALL (LIBERR_LAST + 1)
...

header2.h:

#include "lib_errors.h"

#define HDR2_HOST_UNREACHABLE (LIBERR_LAST + 1)
...
...