2010-06-17 3 views
1

Dites que j'ai une énorme quantité de code et que j'ai différents types de messages d'erreur. Pour ceux-ci, je veux avoir un endroit séparé où je stocke les codes d'erreur et les messages d'erreur. Par exemple, pour une erreur qui a eu lieu parce que le programme n'a pas pu ouvrir un fichier que je magasin:Quels types de bonnes approches les programmeurs C++ utilisent-ils pour stocker les messages d'erreur?

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

Quelle est la meilleure façon de stocker différents types de messages d'erreur et codes dans un fichier pour les programmeurs C++ afin d'utiliser les rapidement et facilement dans un programme?

FYI Je travaille avec Qt lib.

Répondre

1

J'utiliser XML comme ceci:

<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" 
    /> 

Dans le code, vous pouvez l'utiliser comme celui-ci où vous définissez la langue réelle dans la piscine de message. Edit: L'idée du pool de messages est juste d'enrouler un analyseur xml existant + une logique supplémentaire.

+0

C'est une bonne idée et avant d'écrire la question, cela m'est venu à l'esprit. Mais ... Mais je devrais joindre du code supplémentaire afin d'analyser le XML. Donc, je pensais préférable de demander, peut-être une meilleure solution sera trouvée. – Narek

+0

Probablement préférable d'avoir des fichiers séparés pour chaque langue. Ensuite, vous pouvez envoyer un fichier unique pour la traduction. Ou nous avons construit un petit outil qui le convertit en un CSV "anglais, étranger" alors le traducteur peut travailler dessus sans outils spéciaux et sans avoir à comprendre xml, rc, etc –

+4

Depuis l'OP mentionné en utilisant Qt, il devrait utiliser Le système d'internationalisation de Qt (http://doc.qt.nokia.com/latest/internationalization.html). – Job

2

Vous pouvez les mettre dans votre regroupement de ressources, où toutes les autres chaînes sont. Ensuite, utilisez leur code de ressource et vous aurez l'avantage, que tous les messages d'erreur sont traduits dans les différentes langues

+0

Dans MFC, j'ai utilisé des chaînes comme ressources, mais Qt a-t-il ce type de moyen? – Narek

+0

Oui. Qt gère les ressources de chaîne. – Cogwheel

+0

LoadString (LoadStringA/LoadStringW) sont disponibles quel que soit le jeu d'outils de l'interface graphique http://msdn.microsoft.com/en-us/library/ms647486%28VS.85%29.aspx –

0

Quel O/S? Sous Windows, un moyen standard mais relativement compliqué consiste à utiliser Message Files.

0

Dans préfèrent pour générer des messages d'erreur dans le corps du code plutôt que de les garder dans un fichier séparé - par exemple (pris au hasard dans mon propre code):

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

Ceci est pour trois raisons :

  • Il permet plus de messages d'erreur inteligible, avec les valeurs non valides entrecoupées avec le texte du message

  • Erro Association du r tester directement avec le message indique clairement ce qui se passe

  • J'ai vu trop de projets qui utilisaient le code d'erreur WRONG pour une erreur, ce qui est difficile à tester et cause une immense confusion. Par exemple, si F001 est votre fichier d'erreur ouvert, je l'ai vu beaucoup de code comme ceci:

-

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

Bien sûr, faire ce qui rend difficile l'internationalisation, mais ce n'est pas une préoccupation pour le genre de projets que je fais.

+0

Oui, mais pour avoir un seul endroit où vous définissez et utilisez ensuite la même chose, assurez-vous de ne pas générer de messages d'erreur différents pour la même situation. Aussi, il est visible (si c'est dans un fichier) quel genre de situations vous avez traité (travaillé) et ce qui reste à traiter pour le moment. Et aussi pour mon projet l'internationalisation est une grande préoccupation, car, comme je l'ai noté, "j'ai un énorme code". – Narek

+0

@Narek Si c'est la même situation, il devrait être dans la même fonction. En d'autres termes, avoir une fonction commune pour ouvrir des fichiers et signaler des erreurs si elles ne parviennent pas à ouvrir. –

+0

Ce n'est pas toujours comme ça, malheureusement. Je voulais dire que vous pourriez avoir différentes positions mais le même problème - la même erreur. – Narek

3

je dirais que la stratégie est très différente entre:

  • un message d'erreur pour les journaux
  • un message d'erreur à présenter à l'utilisateur

Puisque vous parlez de l'internationalisation , Je suppose que vous devez le présenter à l'utilisateur. Dans ce cas, ce n'est pas différent d'une autre chaîne.

La bibliothèque gettext devrait venir dans :) pratique

+0

+1 gettext pour plateforme agnostique –

0

Ce n'est pas spécifique aux messages d'erreur, mais en termes de Qt, si vous pensez à l'internationalisation et peut-être avoir à traduire tout votre texte utilisateur face à la Linguist Manual (Programmers Section) est à lire absolument. Personnellement, je favorise également l'approche où les erreurs sont littérales au moment où l'erreur se produit, en utilisant QObject::tr() chaque fois qu'un code gratuit, gratuit comme en clair dans le code, l'utilisateur face à la chaîne se produit, vous êtes sur votre chemin pour garder les choses fonctionnent et activer une traduction plus tardive. tr() prend en charge un qualificateur de chaîne pour baliser le texte à traduire

+0

Pourquoi? Peut-être que je l'ai fait d'une meilleure manière! – Narek

+0

Cela pourrait être, mais ne pas sembler dur, sauf s'il y avait un besoin spécifique dans la solution qt qui n'a pas été rempli, vous avez gaspillé votre temps et votre argent. –

Questions connexes