代码之家  ›  专栏  ›  技术社区  ›  Navaneeth K N

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

  •  10
  • Navaneeth K N  · 技术社区  · 14 年前

    我正在写一个跨平台的共享库( .so 在linux和 .dll 在windows中)使用C。当前出现错误时,库函数返回正确的错误代码,并将错误信息写入 stderr . 库函数还向 stdout . 这对基于控制台的客户机很有效。

    现在这个库将有客户端程序,这些程序使用C++和.WxWIDGET编程的GUI。我想知道处理错误和通知错误的最佳实践是什么?用户界面应用程序能否访问 标准输出 标准错误 在所有平台上?

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

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

    4 回复  |  直到 14 年前
        1
  •  15
  •   David Gelhar    14 年前

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

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

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

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

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

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

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

        2
  •  10
  •   caf    14 年前

    一般来说,你不应该写信给 stdout 甚至在控制台应用程序中,也可能破坏应用程序正在生成的输出。 stderr 是可以原谅的,但是除非应用程序请求,否则您仍然不应该真正使用它。

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

        3
  •  2
  •   JeremyP    14 年前

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

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

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

    无论您做什么,您都不想只记录错误消息,因为客户机可能想对它做些什么。e、 g.显示一个对话框。

    我可能会和两个人一起去。

        4
  •  1
  •   BЈовић    14 年前

    在linux上,应该使用 rsyslog . 既然你在处理GUI,也许你也可以弹出一个消息框(并不总是)。

    我不知道窗户是怎么回事,但我想它也有类似的东西。