在 C 库中以一致的方式处理错误时,您认为“最佳实践”是什么?
我一直在考虑两种方法:
总是返回错误代码。一个典型的函数如下所示:
MYAPI_ERROR getObjectSize(MYAPIHandle h, int* returnedSize);
始终提供错误指针方法:
int getObjectSize(MYAPIHandle h, MYAPI_ERROR* returnedError);
当使用第一种方法时,可以编写这样的代码,其中错误处理检查直接放在函数调用上:
int size; if(getObjectSize(h, &size) != MYAPI_SUCCESS) { // Error handling }
这看起来比这里的错误处理代码更好。
MYAPIError error; int size; size = getObjectSize(h, &error); if(error != MYAPI_SUCCESS) { // Error handling }
但是,我认为使用返回值来返回数据会使代码更具可读性,很明显,在第二个示例中,size 变量中写入了一些内容。
您对为什么我应该更喜欢这些方法中的任何一种或可能将它们混合或使用其他方法有任何想法吗?我不喜欢全局错误状态,因为它往往会使多线程使用库的方式更加痛苦。
编辑:只要不涉及异常,C++ 的具体想法也会很有趣,因为目前这不是我的选择......
我喜欢错误作为返回值的方式。如果您正在设计 api,并且希望尽可能轻松地使用您的库,请考虑以下添加:
将所有可能的错误状态存储在一个类型定义的枚举中,并在您的库中使用它。不要只返回整数或更糟,将整数或不同的枚举与返回码混合。
提供一个函数,将错误转换为人类可读的东西。可以很简单。只是错误枚举输入, const char* 输出。
我知道这个想法使多线程的使用有点困难,但如果应用程序程序员可以设置一个全局错误回调,那就太好了。这样,他们将能够在 bug-hunt 会话期间将断点放入回调中。
希望能帮助到你。