Какие хорошие подходы используют программисты на C ++ для хранения сообщений об ошибках? - PullRequest
1 голос
/ 17 июня 2010

Скажем, у меня огромное количество кода и разные виды сообщений об ошибках. Для них я хочу иметь отдельное место, где я храню коды ошибок и сообщения об ошибках. Например, из-за ошибки, возникшей из-за того, что программе не удалось открыть файл, который я храню:

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

Каков наилучший способ для хранения различных видов сообщений об ошибках и кодов в файле для программистов на C ++, чтобы быстро и легко использовать их в программе?

К вашему сведению, я работаю с библиотекой Qt.

Ответы [ 6 ]

3 голосов
/ 17 июня 2010

Я бы сказал, что стратегия чрезвычайно отличается между:

  • сообщение об ошибке для журналов
  • сообщение об ошибке для пользователя

Поскольку вы говорите о интернационализации, я полагаю, что вам нужно представить ее пользователю. В этом случае он не отличается от любой другой строки.

Библиотека gettext должна пригодиться:)

2 голосов
/ 17 июня 2010

Вы можете поместить их в свой пакет ресурсов, где находятся все остальные строки. Затем используйте их код ресурса, и вы получите преимущество в том, что все сообщения об ошибках переведены на разные языки

1 голос
/ 17 июня 2010

Я бы использовал 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-анализатор + некоторую дополнительную логику

0 голосов
/ 18 июня 2010

Это не относится только к сообщениям об ошибках, но с точки зрения Qt, если вы задумываетесь об интернационализации и, возможно, вам необходимо перевести весь текст, обращенный к пользователю, Руководство для лингвистов (раздел для программистов) необходимо прочитать , Лично я также предпочитаю подход, в котором сообщения об ошибках буквальны в момент возникновения ошибки, используя QObject::tr() всякий раз, когда встречается свободная, свободная, как обычная строка, встроенная в код, когда пользователь сталкивается со строкой. и включить более поздний перевод. tr() поддерживает спецификатор строки для разметки текста для перевода

0 голосов
/ 17 июня 2010

In фактически предпочитают генерировать сообщения об ошибках в теле кода, а не хранить их в отдельном файле - например (выбирается случайным образом из моего собственного кода):

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

Это по трем причинам:

  • Это допускает более интеллектуальные сообщения об ошибках, с недопустимыми значениями, чередующимися с текстом сообщения

  • Связывание теста ошибок непосредственно с сообщением проясняет, что происходит

  • Я видел слишком много проектов, в которых использовался НЕПРАВИЛЬНЫЙ код ошибки для ошибки, которую сложно проверить и которая вызывает огромную путаницу. Например, если F001 - ваша ошибка открытия файла, то я видел много такого кода:

-

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

Конечно, это усложняет интернационализацию, но это не касается проектов, которые я делаю.

0 голосов
/ 17 июня 2010

Какой O / S?В Windows одним стандартным, но относительно сложным способом является использование файлов сообщений .

...