共享库中的错误处理策略 - C.

Nav*_*K N 10 c c++ error-handling shared-libraries

我正在使用C 编写跨平台共享库(.so在linux和.dllwindows中).目前,当出现错误时,库函数会返回正确的错误代码并将错误信息写入stderr.库函数还会发送一些信息和调试消息stdout.这适用于基于控制台的客户端.

现在这个库将拥有使用C++和wxWidgets编程的GUI的客户端程序.我想知道处理错误并通知错误的最佳做法是什么?一个UI应用程序访问数据来stdoutstderr在所有平台上?

我想的另一种方法是库初始化函数初始化一个具有函数指针的结构.库上的所有函数都将采用此结构的实例并调用函数指针.这样客户端可以选择打印消息的位置.

我想知道解决这个问题的明显方法是什么?任何帮助都会很棒.

Dav*_*har 15

最佳实践(IMHO)是一个库不能向stderr(或stdout)打印任何内容,因为它们甚至可能不存在.除了GUI情况之外,您还有一个没有"控制台"的服务器应用程序的用例,并且可能希望使用syslog()之类的函数来记录错误.

一些处理错误信息而不直接打印的方法:

  • 返回一个数字错误代码,并提供一个将其转换为字符串的函数

  • 返回一个struct/object错误代码,其中包含其他信息

  • 在"会话"对象上提供一个函数,该对象返回有关上一个错误的信息

  • 允许调用者注册在发生错误时调用的回调

我不太适合"从库中写入stderr"规则的一个例外是,如果库具有"调试模式"参数,可以将详细信息记录到stderr.


caf*_*caf 10

通常,您不应该stdout从库中写入- 即使在可能破坏应用程序正在生成的输出的控制台应用程序中也是如此. stderr是可以原谅的,但除非应用程序要求,否则你仍然不应该使用它.

OpenSSL是一个跨平台的共享库,它有很多相同的问题需要解决.他们的方法在内部错误队列中具有库记录详细错误信息,应用程序可以在看到错误返回值时请求,然后以适当的方式呈现给用户.(它还提供了一个便利功能,可将整个错误队列转储到a FILE *).