C静态库上的错误处理实现

问题描述

我正在用C实现一个简单的静态库,关于错误处理的实现我有一些基本问题。

为示例起见,我的图书馆支持使用java.lang.IllegalArgumentException: Unable to resolve Configuration with the provided Issuer of ....结构的基本链接列表:

Node

让我们说,作为我提供的接口的一部分-我给出了一个函数的实现,该函数将新的typedef struct Node { struct Node* next; struct Node* prev; int* data; }Node; typedef struct LinkedList { Node* head; Node* tail; }LinkedList; 作为Node头插入

LinkedList

例如,我想捕获最基本的错误-我的库用户尝试输入void insertHead(LinkedList* LinkedList,Node* node) { if(LinkedList == NULL || node == NULL) { // How to implement? } } 指针。我知道使用NULL或打印错误不是一个好主意,而且-使用stderr s不是一个好主意。

我有点理解,我需要使用一个包含错误代码全局变量来构建自己的“错误捕获机制”,并将其转换为字符串(例如枚举?)。

但是-我不知道如何实现这种机制,我的库用户将如何遇到错误本身?接口本身(assert文件仅具有方法声明等,.lib文件具有实现)-因此在链接和编译等之后,用户将如何“看到”错误我提供的?

我想举一个有关如何处理用户输入错误的简短示例,对不起,因为不清楚,我很困惑。

解决方法

我知道使用stderr或打印错误不是一个好主意,而且-使用断言也不是一个好主意。

您是对的,两者在图书馆中都非常糟糕。

我有点理解,我需要使用全局变量来构建自己的“错误捕获机制”,该变量包含错误代码,并转换为字符串(例如枚举?)。

不需要全局变量,这是一个坏主意。提供人类/英语可读的字符串等效项还不错,但并不是真正需要的。将其留给应用程序(如果他们需要本地化字符串呢?)。

我的图书馆用户将如何自身遇到错误?

库通常提供库#include的用户在一个或多个头文件中所需的内容。


最简单的方法是让您的函数返回错误代码:

Error insertHead(LinkedList* LinkedList,Node* node)
{
    if(LinkedList == NULL || node == NULL)
    {
        return LINKEDLIST_ERROR_INVALID_ARGUMENT;
    }
}

此处Error只能是整数,LINKEDLIST_ERROR_INVALID_ARGUMENT可以是#define。另一种选择是使用enum。这些定义将在您提供给库用户的头文件中。

您的呼叫者只需要这样做:

#include <yourlibrary.h>

// ...
{
    if (insertHead(...) != ERROR_OK)
        // whatever they need to do with the error
}