gpt4 book ai didi

c++ - 什么是从C共享库传回错误字符串的线程安全的好方法

转载 作者:太空狗 更新时间:2023-10-29 20:31:20 25 4
gpt4 key购买 nike

我正在编写一个供内部使用的C共享库(如果很重要,我将使用dlopen()将其共享到c++应用程序中)。共享库(通过其他方式)通过JNI模块加载一些Java代码,这意味着所有噩梦错误模式都可能来自我需要在应用程序中智能处理的JVM。此外,该库需要重新输入。在这种情况下,是否存在惯用语将错误字符串传递回去?还是我坚持将错误映射到整数并使用printfs进行调试?

谢谢!

最佳答案

我对这个问题的处理方式与其他所有人的处理方式有所不同。他们没有错,只是我不得不为此问题的另一个方面而努力。

  • C API需要提供数字错误代码,以便使用该API的代码可以采取明智的措施从适当的错误中恢复,并在不正确的情况下传递错误。 errno.h代码展示了良好的错误分类;实际上,如果您可以重复使用这些代码(或仅将它们传递给其他人,例如,如果所有错误最终都来自系统调用),请这样做。
  • 不要复制errno本身。如果可能,直接从可能失败的函数返回错误代码。如果不可能,请在状态对象上使用GetLastError()方法。您有一个状态对象,是吗?
  • 如果您必须发明自己的代码(errno.h代码不会削减代码),请提供类似于strerror的功能,将这些代码转换为人类可读的字符串。
  • 转换这些字符串可能合适,也可能不合适。如果它们仅供开发人员阅读,请不要打扰。但是,如果您需要将它们显示给最终用户,是的,您需要翻译它们。
  • 这些字符串的未翻译版本确实应该只是字符串常量,因此您不会感到头疼。但是,不要浪费时间和精力来编写自己的翻译基础结构。使用GNU gettext
  • 如果您的代码位于另一段代码之上,那么至关重要的是,您可以直接访问该代码产生的所有错误信息和相关上下文信息,并使开发人员可以轻松地将自己的代码包装起来在最终用户的错误消息中显示该信息。
  • 例如,如果您的库由于失败的系统调用而直接产生自己设计的错误代码,则您的状态对象需要使用一些方法,这些方法返回在失败的系统调用之后立即观察到的errno值,即所涉及文件的名称(如果任何),并且理想情况下还包括系统调用本身的名称。人们经常会出错(例如,SQLite,否则设计得不错的API)不会公开errno值或文件名,这使得区分“数据库文件权限错误”非常困难。摘自“您的代码中有错误”。

  • 编辑:附录:此区域的常见错误包括:
  • 扭曲您的API(例如,使用输出参数),以便自然会返回其他值的函数会返回错误代码。
  • 没有为调用者提供足够的详细信息,以使其能够生成错误消息,从而使知识渊博的人员可以解决问题。 (此知识渊博的人员可能不是最终用户。可能是您的错误消息出现在服务器日志文件或崩溃报告中,仅供开发人员使用。)
  • 公开错误之间太多不同的精细区别。如果您的 call 者永远不会合理地响应两个不同的错误代码而做不同的事情,那么它们应该是相同的代码。
  • 提供多个成功代码。这是在寻求细微的错误。

  • 另外,请仔细考虑应允许哪些API失败。以下是一些永不失败的事情:
  • 只读数据访问器,尤其是那些返回标量数量的访问器,尤其是那些返回 bool(boolean) 值的访问器。
  • 在最一般的意义上讲,析构函数。 (这是UNIX内核API中的一个经典错误:closemunmap应该不会失败。所幸,至少_exit不能。)
  • 在很大的情况下,如果abort失败,则应立即调用malloc,而不是尝试将其传播给调用方。 (由于异常和RAII的原因,在C++中不是这样-如果您很幸运,可以从事可以正确使用这两个方法的C++项目。)

  • 结束语:有关如何处理所有错误的示例,只不过是 XPCOM而已。

    关于c++ - 什么是从C共享库传回错误字符串的线程安全的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4514730/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com