2009-10-11 10 views
3

Actuellement, j'ai ce code pour préfixer un « tag » à un message d'exception qui me donne une version très légère d'une trace de la pile:Préfixer une chaîne à une autre chaîne

try { 
    doSomething(); 
} catch (std::exception& e) { 
    int size = 8 + _tcslen(e.what()); 
    TCHAR* error = new TCHAR[size]; 
    _sntprintf(error, size, TEXT("myTag: %s"), e.what()); 
    std::exception x = std::exception(error); 
    delete []error; 
    throw x; 
} 

Il semble tout simplement horrible et je Je suis sûr qu'il doit y avoir un moyen facile d'y parvenir. Pourriez-vous s'il vous plaît m'aider avec cela?

+5

Vous avez une réponse à votre question de traitement de chaîne, mais je dois dire que votre gestion des exceptions semble assez suspect. Vous avez attrapé une exception 'e', ​​qui peut être de n'importe quelle classe dérivée de std :: exception, mais vous êtes alors en train de découper e et de perdre le type e. –

+0

merci pour le commentaire. Je n'y ai pas pensé depuis que je lance seulement std :: exception dans la fonction interne. Cependant, je vois maintenant ce que tu veux dire. Quelle serait l'alternative? Modifier le texte interne what() directement et lancer l'exception originale? – Etan

+3

* Vous * ne pouvez lancer explicitement std :: exceptions, mais le STL peut aussi lancer. Si vous voulez seulement gérer vos propres exceptions, pensez à écrire votre propre classe d'exception où vous pouvez modifier la chaîne? –

Répondre

3

ce que quelque chose comme ceci:

throw std::exception(std::string("myTag: ").append(e.what()).c_str());

Ajout d'un appel à c_str() et testé dans Visual Studio et il fonctionne (Note: cela ne compile pas dans gcc, il y a seulement une constructeur par défaut dans l'implémentation).

+0

merci! (se sentir stupide que j'ai réfléchi à ce sujet pendant près d'une heure sans jamais penser à la chaîne :: std ....) – Etan

0

Oui, il y a.

std::string S1="Hello",S2=" World"; 
S1+=S2; 
0

Pourquoi ne pas utiliser directement std::string. Vous pouvez faire std::string s = std::string("myTag") + e.what(). Et si vous voulez char * pointer utilisez c_str() fonction de membre de la chaîne.

3

Pourquoi n'utilisez-vous pas std :: string?

try { 
    doSomething(); 
} catch (const std::exception& e) 
{ 
    throw std::exception(std::string("myTag: ") + e.what()); 
} 

Autres notes: A ma connaissance std :: exception ne dispose pas de cette forme de constructeur (seulement ses sous-classes font).

Vous ne savez pas pourquoi vous utilisez un tampon TCHAR. Est-ce que std::exception::what peut toujours renvoyer autre chose que char*? Si c'est le cas, vous pouvez peut-être utiliser std::basic_string<TCHAR>.

Une chose importante à garder à l'esprit: ce qui renvoie un const char* (pour une raison quelconque). Par exemple, il a laissé se demander où les 10 ou 13 caractères ont disparu:

throw some_exception(e.what() + '\n' + moreinfo); 
+0

vous avez raison. std :: exception renvoie un 'const const charel '. – Etan

+0

@fnieto: Êtes-vous down_ot_me_ parce que OP utilise ce constructeur non standard, et je l'ai même commenté? Quant à ne pas utiliser const, je suppose que c'est une force d'habitude (je ne peux pas me souvenir de voir un morceau de code l'attraper par référence const dans les tutoriels). – UncleBens

+0

+1 pour contrer le downvote..c'est une réponse parfaitement valide. – Naveen

Questions connexes