共享库中的error handling策略 – C.

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

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

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

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

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

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

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

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

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

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

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

通常,您不应该从库中写入stdout – 即使在可能破坏应用程序正在生成的输出的控制台应用程序中也是如此。 stderr稍微宽容一点,但除非应用程序请求,否则你仍然不应该使用它。

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

对于日志消息,您应该允许客户端向库提供回调函数,然后客户端可以决定如何处理它们,例如发送到syslog或显示在屏幕上的窗口中。

对于返回错误,您有三个基本策略:

  1. 返回错误代码并具有将其转换为消息的函数
  2. 传递指针参数,该参数指向将保存错误消息信息的对象
  3. 有一些全局库对象包含上一个操作的错误信息。

无论您做什么,您都不希望仅记录错误消息,因为客户端可能想要对其执行某些操作。 例如,出现一个对话框。

我大概和2一起去。

在linux上,您应该使用rsyslog记录错误,而不是在标准输出(或标准错误)上打印错误。 既然你正在处理GUI,也许你也可以弹出一个消息框(并不总是)。

我不知道窗户,但我认为它有类似的东西。