【问题标题】:Error handling strategies in a shared library - C共享库中的错误处理策略 - C
【发布时间】:2010-11-17 05:49:44
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++ c error-handling shared-libraries


    【解决方案1】:

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

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

    • 返回数字错误码,并提供转成字符串的函数

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

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

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

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

    【讨论】:

      【解决方案2】:

      一般来说,您根本不应该从您的库中写信给stdout - 即使在可能会破坏应用程序正在生成的输出的控制台应用程序中也是如此。 stderr 更容易被原谅,但除非应用程序请求,否则您仍然不应该真正使用它。

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

      【讨论】:

      • 还有一个问题。那么在 OpenSSL 中,内部错误队列是如何被清除的呢?
      • @Appu:为应用程序提供了请求“下一个错误”的功能。这会从内部队列中移除最早的错误,并将其返回给应用程序。
      【解决方案3】:

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

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

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

      无论您做什么,您都不想只记录错误消息,因为客户端可能想用它做点什么。例如显示一个对话框。

      我可能会选择 2。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2021-12-27
          • 1970-01-01
          • 2014-12-19
          • 2010-12-07
          • 1970-01-01
          • 2011-04-24
          • 2011-05-08
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多