我正在使用C编写跨平台共享库(Linux中的.so
和Windows中的.dll
)。目前,当出现错误时,库函数会返回正确的错误代码并将错误信息写入stderr
。库函数还向stdout
发送一些信息和调试消息。这适用于基于控制台的客户端。
现在这个库将拥有使用C ++编程的GUI的客户端程序。 wxWidgets的。我想知道处理错误并通知错误的最佳做法是什么? UI应用程序是否可以访问所有平台上的stdout
和stderr
数据?
我想到的另一种方法是库初始化函数初始化一个具有函数指针的结构。库上的所有函数都将采用此结构的实例并调用函数指针。这样客户端可以选择打印消息的位置。
我想知道解决这个问题的明显方法是什么?任何帮助都会很棒。
答案 0 :(得分:15)
最佳实践(IMHO)是指图书馆不向stderr(或stdout)打印任何内容,因为它们甚至可能不存在。除了GUI情况之外,您还有一个没有“控制台”的服务器应用程序的用例,并且可能希望使用syslog()之类的函数来记录错误。
处理错误信息而不直接打印的一些方法:
返回数字错误代码,并提供将其转换为字符串的功能
返回结构/对象错误代码,其中包含其他信息
在“会话”对象上提供一个函数,该对象返回有关上一个错误的信息
允许调用者注册在发生错误时调用的回调
我不太适合从“库中写入stderr”规则的一个例外是,如果库具有“调试模式”参数,可以将详细信息记录到stderr。
答案 1 :(得分:10)
通常,您不应该从库中写入stdout
- 即使在可能破坏应用程序正在生成的输出的控制台应用程序中也是如此。 stderr
稍微宽容一点,但除非应用程序请求,否则你仍然不应该使用它。
OpenSSL是一个跨平台的共享库,需要解决同样的问题。他们的方法在内部错误队列中具有库记录详细错误信息,应用程序可以在看到错误返回值时请求,然后以适当的方式呈现给用户。 (它还提供了一个便利功能,可将整个错误队列转储到FILE *
)。
答案 2 :(得分:2)
对于日志消息,您应该允许客户端向库提供回调函数,以便客户端可以决定如何处理它们,例如发送到系统日志或显示在屏幕上的窗口中。
对于返回错误,您有三个基本策略:
无论您做什么,您都不希望仅记录错误消息,因为客户端可能想要对其执行某些操作。例如提出一个对话框。
我可能主要选择2。
答案 3 :(得分:1)
在linux上,您应该使用rsyslog来记录错误,而不是在标准输出(或标准错误)上打印错误。由于您正在处理GUI,也许您也可以弹出一个消息框(并非总是如此)。
我不知道窗户,但我认为它有类似的东西。