【问题标题】:Error handling implementation on C static librariesC静态库的错误处理实现
【发布时间】:2020-08-29 10:12:29
【问题描述】:

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

为了举例,我的库支持使用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 或打印错误不是一个好主意,而且 - 使用asserts 也不是一个好主意。

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

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

我很想获得一个关于如何处理用户输入错误的简短示例,抱歉有点不清楚 - 我只是感到困惑。

【问题讨论】:

    标签: c error-handling static-libraries


    【解决方案1】:

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

    你是对的,在图书馆里两者都会很糟糕。

    我有点明白我需要使用一个包含错误代码并转换为字符串的全局变量来构建我自己的“错误捕获机制”(也许像枚举?)。

    不需要全局变量,这是个坏主意。提供人类/英语可读的字符串等价物并不算太糟糕,但并不是真正需要的。把它留给应用程序(如果他们需要本地化字符串怎么办?)。

    我的图书馆的用户会如何遇到错误本身?

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


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

    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
    }
    

    【讨论】:

    • 所以基本上只是使用#define的宏错误代码?
    • @WillC99997 或者一个枚举,是的。
    • 谢谢。问题是我的许多方法都返回了不支持此实现的特定数据类型 - 所以我将不得不使用一个全局变量来保存当前错误代码或我猜的东西。
    • @WillC99997 使用返回参数代替输出数据类型来释放返回值。
    猜你喜欢
    • 2021-11-27
    • 2021-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    相关资源
    最近更新 更多