问题描述
我正在用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
}