【问题标题】:What kind of good approaches do C++ programmers use for storing error messages?C++ 程序员使用什么样的好方法来存储错误消息?
【发布时间】:2010-06-17 14:25:01
【问题描述】:

假设我有大量代码并且有不同类型的错误消息。对于这些,我想有一个单独的地方来存储错误代码和错误消息。例如,对于由于程序无法打开我存储的文件而发生的错误:

F001    "Can not open a file." "The same error message in another language" "The same error message in a third language"

为 C++ 程序员在文件中存储不同类型的错误消息和代码以便在程序中快速轻松地使用它们的最佳方式是什么?

仅供参考,我正在使用 Qt 库。

【问题讨论】:

    标签: c++ qt messages


    【解决方案1】:

    我会说策略在以下方面截然不同:

    • 日志的错误消息
    • 要向用户显示的错误消息

    既然您谈到国际化,我想您需要将其呈现给用户。在这种情况下,它与任何其他字符串没有什么不同。

    gettext 库应该会派上用场:)

    【讨论】:

      【解决方案2】:

      您可以将它们放在您的资源包中,所有其他字符串都在其中。然后使用他们的资源代码,您将受益,所有错误消息都被翻译成不同的语言

      【讨论】:

      • 在MFC中我使用字符串作为资源,但是Qt有这种手段吗?
      • 是的。 Qt 确实处理字符串资源。
      • LoadString(LoadStringA/LoadStringW) 无论 GUI 工具集如何都可用msdn.microsoft.com/en-us/library/ms647486%28VS.85%29.aspx
      • +1,这与 Qt Linguist 相结合,可为您提供国际化。
      【解决方案3】:

      我会像这样使用 XML:

      <languageList>
          <language short="de" long="Deutsch" default="true" />
          <language short="en" long="English" />
      </languageList>
      <string alias="couldNotOpenFileError"
          de="Konnte Datei nicht öffnen"
          en="Could not open file"
          />
      <string alias="couldNotWriteFileError"
          de="Konnte Datei nicht schreiben"
          en="Could not write file"
          />
      

      在代码中,您可以像这样使用它,在消息池中设置实际语言。

      String errorMsg = ErrorMessagePool.get("couldNotOpenFileError") + additionalInformationString;
      

      编辑:消息池的想法只是包装现有的 xml 解析器+一些额外的逻辑。

      【讨论】:

      • 这是一个好主意,在写下这个问题之前我就想到了。但是...但是我应该附加额外的代码来解析 XML。所以我想最好问一下,可能会找到更好的解决方案。
      • 最好为每种语言设置单独的文件。然后您可以发送一个文件进行翻译。或者我们构建了一个小工具,将其转换为 CSV “english,foreign”,然后翻译人员无需特殊工具即可对其进行处理,而无需了解 xml、rc 等
      • 既然OP提到使用Qt,他应该使用Qt的国际化系统(doc.qt.nokia.com/latest/internationalization.html)。
      【解决方案4】:

      哪个操作系统?在 Windows 上,一种标准但相对复杂的方法是使用Message Files

      【讨论】:

        【解决方案5】:

        实际上更喜欢在代码主体中生成错误消息,而不是将它们保存在单独的文件中 - 例如(从我自己的代码中随机挑选):

        if ( ev[0] != SUB_CMD ) {
            CSVTHROW( "Invalid edit sub-command '" << ev[0] << "' in '" << ev << "' " );
        }
        

        这有三个原因:

        • 它允许更易理解的错误消息,无效值散布在消息文本中

        • 将错误测试直接与消息相关联可以清楚地了解发生了什么

        • 我见过太多的项目使用 WRONG 错误代码来表示错误,这很难测试并导致巨大的混乱。例如,如果 F001 是您的文件打开错误,那么我见过很多这样的代码:

        -

        if ( login_invalid() ) {
           ERROR( "F001" );
        }
        

        当然,这样做会使国际化变得困难,但这不是我所从事的项目所关心的问题。

        【讨论】:

        • 是的,但是要在一个地方定义然后使用相同的东西,确保您不会为相同的情况生成不同的错误消息。它也是可见的(如果它在一个文件中)您已经处理(处理)了什么样的情况以及还有什么需要处理。而且对于我的项目来说,国际化也是一个大问题,因为正如我所指出的,“我有一个庞大的代码”。
        • @Narek 如果是同样的情况,应该是同一个函数。换句话说,有一个打开文件和打开失败报告错误的通用功能。
        • 不幸的是,并非总是这样。我的意思是你可能有不同的位置,但同样的问题——同样的错误。
        • 您是否找到了一个仅检查源文件中的 "" 字符串的拼写检查器?这就是为什么我使用外部字符串标题
        • @Cogwheel 我回答后添加了关于“另一种语言”的问题,因为他正在使用Qt。
        【解决方案6】:

        这不是特定于错误消息的,但就 Qt 而言,如果您正在考虑国际化并且可能必须翻译所有面向用户的文本,Linguist Manual (Programmers Section) 是必读的。我个人也赞成在错误发生时错误消息是文字的方法,只要一个免费的、免费的,就像嵌入在代码中的普通的、面向用户的字符串一样,使用QObject::tr(),你就可以很好地保持工作正常并启用以后的翻译。 tr() 支持字符串限定符来标记要翻译的文本

        【讨论】:

        • 为什么必须使用 Qt 国际化?也许我做得更好!
        • 可能是这样,但听起来并不苛刻,除非 qt 解决方案中存在特定需求而没有满足您的时间和金钱。
        猜你喜欢
        • 2011-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-13
        • 2017-07-09
        • 1970-01-01
        相关资源
        最近更新 更多