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

C++ 共享库中的错误处理策略-C,c++,c,error-handling,shared-libraries,C++,C,Error Handling,Shared Libraries,我正在使用C编写一个跨平台共享库(.so在linux和.dll在windows中)。当前,当出现错误时,库函数会返回正确的错误代码,并将错误信息写入stderr。库函数还向标准输出一些信息和调试消息。这适用于基于控制台的客户端 现在这个库将有客户端程序,使用C++和WxWIDGET编程的GUI。我想知道处理错误和通知错误的最佳实践是什么?UI应用程序能否访问所有平台上的stdout和stderr的数据 我想的另一种方法是,库初始化函数初始化一个具有函数指针的结构。库中的所有函数都将采用此结构的一

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

现在这个库将有客户端程序,使用C++和WxWIDGET编程的GUI。我想知道处理错误和通知错误的最佳实践是什么?UI应用程序能否访问所有平台上的
stdout
stderr
的数据

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

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

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

在不直接打印错误信息的情况下处理错误信息的一些方法:

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

  • 返回结构/对象错误代码,其中包含其他信息

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

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


“不要从库中写入stderr”规则的一个例外是,如果一个库有一个“debug mode”参数,可以将详细信息记录到stderr中,我会比较满意,您根本不应该从库中写入
stdout
——即使在控制台应用程序中,也可能会损坏应用程序正在生成的输出
stderr
更容易理解,但除非应用程序请求,否则不应该真正使用它


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

在linux上,您不应该在标准输出(或标准错误)上打印错误,而应该使用。由于您使用的是GUI,也许您还可以弹出一个消息框(并非总是如此)


我不知道windows,但我认为它有类似的功能。

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

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

  • 返回一个错误代码,并具有将其转换为消息的函数
  • 传递指向将保存错误消息信息的对象的指针参数
  • 具有包含上次操作错误信息的某些全局库对象
  • 无论您做什么,您都不希望只记录错误消息,因为客户机可能希望对其进行处理。e、 g.显示一个对话框


    我多半会选择2个。

    还有一个问题。那么在OpenSSL中,内部错误队列是如何被清除的呢?@Appu:为应用程序提供了一个请求“下一个错误”的函数。这将从内部队列中删除最早的错误,并将其返回给应用程序。