C代码中的错误处理

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

在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,并且希望尽可能地使用您的库,请考虑以下添加:

  • 将所有可能的错误状态存储在一个类型流的枚举中,并在库中使用它。不要仅仅返回INT,甚至更糟的是,将INT或不同的枚举与返回代码混合。
  • 提供一个将错误转换为人类可读内容的函数。
  • 我知道这个想法会使多线程的使用有点困难,但是如果应用程序程序员能够设置一个全局错误回调,那就太好了。这样,他们就可以在bug搜索会话期间将一个断点放入回调中。
用户回答回答于

如果唯一可能的错误是程序员错误,不要返回错误代码,在函数中使用断言。

验证输入的断言清楚地传达了函数所期望的内容,而过多的错误检查可能会模糊程序逻辑。决定如何处理所有不同的错误案例确实会使设计复杂化。如果您可以坚持程序员永远不会传递空指针,那么为什么要搞清楚函数X应该如何处理空指针呢?

扫码关注云+社区