以前开发的时候经常遇到对外暴露的函数需要提供一些返回值,来表达函数是否出错。
但有时候一个函数可能出现多种错误,所以单纯返回-1 也无法满足需要。有些人的处理方式是增加一个 errno 来标记错误。
但个人感觉还是有些麻烦,而且需要考虑多线程问题。
所以实现了这样一个返回值管理的组件放到了 Melon 库中。
先给出一个例子,大家看看效果吧。
#include "mln_error.h"
#define OK 0
#define NMEM 1
int main(void)
{
char msg[1024];
mln_string_t files[] = {
mln_string("a.c"),
};
mln_string_t errs[] = {
mln_string("Success"),
mln_string("No memory"),
};
mln_error_init(files, errs, sizeof(files)/sizeof(mln_string_t), sizeof(errs)/sizeof(mln_string_t));
printf("%x %d [%s]\n", RET(OK), CODE(RET(OK)), mln_error_string(RET(OK), msg, sizeof(msg)));
printf("%x %d [%s]\n", RET(NMEM), CODE(RET(NMEM)), mln_error_string(RET(NMEM), msg, sizeof(msg)));
printf("%x %d [%s]\n", RET(2), CODE(RET(2)), mln_error_string(RET(2), msg, sizeof(msg)));
printf("%x %d [%s]\n", RET(0xff), CODE(RET(0xff)), mln_error_string(RET(0xff), msg, sizeof(msg)));
return 0;
}
这个程序的执行结果如下:
0 0 [Success]
ffffedff 1 [a.c:18:No memory]
ffffec01 255 [a.c:19:Unknown Code]
ffffeb01 255 [a.c:20:Unknown Code]
可以看到,通过一个 int 值,我可以获取到错误码、文件、行号甚至是错误码对应的描述。
当然这些内容需要在返回值管理组件初始化的时候给出。
这样,每一份代码的每一个使用RET
生成的错误码将是全项目中独一无二的一个负整数。只要有了这个负整数,同时知道了代码的版本,就可以轻松获取到错误的位置和错误内容。
感兴趣的可以看一下Melon 的官方文档了解详情。
1
nightwitch 2023-10-06 18:32:48 +08:00
还有一种做法(OpenGL/Vulkan)就是允许用户注册一个回调函数来处理错误,在回调函数的参数里把需要的信息传过去就行了。
|
2
monkeyNik OP @nightwitch 这也是个思路,可以在回调函数里面对一些特定位置的特定错误做一些特殊处理。
|