2010-01-22 6 views
1

Savez-vous comment puis-je enregistrer l'exception? maintenant le message dans l'instruction catch est imprimé, mais je ne peux pas comprendre pourquoi dans Manage.Gere() appelé sutously.Comment enregistrer une exception C++

try{ 
    Manager.Gere(&par,&Acc, coman, comando, RunComando, log, &parti, comandosS, RunComandosSuper,true); 
} 
catch (...) 
{ 
    log("ERROR ENTER GERE*****"); 
} 


Perif::Gere(CString *par, CString *Acc, HANDLE coman, HANDLE comando, HANDLE RunComando, Log &log, CString *parti, HANDLE comandosS, HANDLE RunComandosSuper,bool first) 
{ 
    log->LogD("Perif :: Gere Enter****** "); //It doesnt get printed 

} 
+0

Pouvez-vous s'il vous plaît essayer d'ajouter plus d'informations sur ce que vous voulez réaliser? Voulez-vous écrire l'exception dans un journal (sous Unix, Windows?) Ou voulez-vous comprendre pourquoi la méthode échoue/n'échoue pas? – csl

+0

Gérer devrait être interdit que le nom de classe –

+0

veut comprendre pourquoi la méthode échoue, pourrait être un problème avec ses paramètres? – Reversed

Répondre

0

La première chose dont vous avez besoin est de trouver les exceptions que Manage.Gere peut lancer.
Alors catch les spécifiquement comme catch(FirstExceptionGereThrows &exc) et quand vous attrapez toutes les exceptions possibles, vous saurez ce qui échoue dans Manage.Gere.

catch(FirstException &exc){ 
    log << "Failed because FirstException\n"; 
}catch(SecondException &exc){ 
    log << "Failed because SecondException\n"; 
} 

Après, et si vous êtes assez chanceux les exceptions lancées par Manage.Gere peuvent inclure quelques informations supplémentaires à propos de l'accident que vous pourriez vous connecter aussi bien.

catch(FirstException &exc){ 
    log << "Failed because FirstException: " << exc.what() << "\n"; 
} 
+0

Comment puis-je trouver quelles exceptions Manage.Gere peut lancer? Tks – Reversed

+0

Documentation ou en regardant dans le code Manage.Gere, il n'y a pas d'autre moyen. –

+1

Si les exceptions sont dérivées de std :: exception, il n'y a aucun besoin absolu de les attraper spécifiquement - juste attraper std :: exception, et examiner son membre what(). –

2

Une API sage ne doit jeter des objets de types dérivés de std::exception. Si c'est le cas, l'exception aura une fonction membre const char *what() contenant un message, qui, nous l'espérons, décrira l'erreur. Donc, vous pouvez essayer cela, et nous espérons que cela aide:

try { 
    Manage.Gere(...); 
} catch (const std::exception &e) { 
    log(e.what()); 
} catch (...) { 
    log("Manage.Gere threw unknown exception"); 
} 

Si elle jette un type qui n'est pas std::exception, alors vous aurez besoin de regarder la documentation et/ou d'une source de la fonction pour voir ce que pourrait aller mal, et quels types il jette. Si rien de tout cela n'est disponible, je chercherais une meilleure bibliothèque.

+0

juste essayé votre code et dans le journal a montré "Manage.Gere a jeté l'exception inconnue" – Reversed

+0

Alors tout ce qui a été levé n'était pas une sous-classe de 'std :: exception' ...c'est peut-être une classe définie par l'utilisateur ou définie par la bibliothèque ou un type de base comme 'const char *'? –

+0

Il pourrait être utile d'ajouter des gestionnaires pour 'const char *' et 'const std :: string &', comme Neil le suggère dans sa réponse, et aussi 'const CString &' (que je suppose être une autre classe de chaînes). Si cela ne vous aide pas, alors la seule option est de lire la documentation/source pour la fonction. –

0

Comme d'autres l'ont suggéré, RTFM est vraiment la réponse. Cependant, j'ai trouvé que les programmeurs écrivent souvent paresseux code comme:

if (something) { 
    throw "Something has happened!"; 
} 

donc il vaut toujours la peine d'essayer d'attraper les deux ans const char * std :: string:

try { 
    // stuff 
} 
catch(const char * s) { 
    cerr << s << endl; 
} 
catch(const std::string & s) { 
    cerr << s << endl; 
} 
// other catches here 
+0

En plus des chaînes, je trouve beaucoup de 'throw int (errorCode)' donc ça vaut la peine d'essayer de les attraper aussi. –

0

Vous pouvez également utiliser mon outil en tant que débogueur externe qui attrape les exceptions C++ et crée automatiquement des fichiers minidump pour le débogage hors ligne. Voir http://alax.info/blog/1211 pour plus de détails. La bonne chose est que vous n'avez pas besoin de code pour cela, ou vous pouvez même déboguer une application pour laquelle vous n'avez pas de code, ou vous ne pouvez pas le reconstruire pour une raison quelconque. Le fichier de vidage vous obtiendra des piles et des informations, et l'application sera en mesure de continuer l'exécution.

Questions connexes