2010-03-16 2 views
2

Je débogue un service qui rencontre des problèmes au démarrage. Pour m'aider, j'emballe presque tout dans un bloc try/catch et j'écris des erreurs dans un fichier. Je ne veux pas les mettre dans toutes les méthodes, je veux juste les mettre dans les méthodes de plus haut niveau afin qu'ils attrapent des exceptions d'autres méthodes.Existe-t-il un moyen de déterminer les lacunes dans la couverture essai/prise?

Cependant, quelque chose se passe, car le service s'arrête dans certaines conditions. Y a-t-il un moyen de déterminer où se trouvent les lacunes dans ma couverture essai/prise, autrement que par la vue?

+0

Est-ce que ce code est natif ou managé? C# ou C++? –

Répondre

1

essayez d'essayer/attraper main fonction et toutes les fonctions de thread. Cela devrait combler les lacunes, à moins que le code tiers engendre des fils

+0

Je suis assez sûr d'avoir ça, ce qui me laisse perplexe. –

+0

Êtes-vous sûr qu'aucun thread n'est généré? Voulez-vous le faire pour le débogage ou prévoyez-vous d'utiliser cette journalisation en production? – Andrey

+0

Les fils sont engendrés, je me suis juste assuré que j'attrapais des exceptions dedans d'eux. Je le fais à des fins de débogage. –

4

Vous pouvez prendre des exceptions au niveau AppDomain comme ceci:

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); 

void CurrentDomain_UnhandledException(Object sender, UnhandledExceptionEventArgs e) 
{ 

    //Object exception = e.ExceptionObject; 
    //Boolean terminating = e.IsTerminating; 
} 

Vous pouvez consulter ce link pour plus d'exemples.

+0

surtout si l'application est écrite en C++ natif;) – Andrey

+0

J'ai essayé de le faire, mais je ne pense pas qu'il a attrapé une exception. J'ai souscrit à l'événement dans la première ligne de la méthode OnStart de mon service, et dans la méthode handler, j'ai fait l'appel à ma méthode de journalisation, comme ceci: \t \t \t Utility.LogError (e.ExceptionObject as Exception); Cependant, mon service semble avoir fermé, mais je n'ai pas de journal. Cela devrait attraper des exceptions sur d'autres threads, aussi, non? –

1

Vous n'avez pas spécifié l'environnement (le service Windows peut signifier géré ou non géré). Je vais deviner que vous travaillez en code natif, probablement en C ou C++. Si c'est le cas, vous devez être certain que vous utilisez la gestion des exceptions structurée à partir de Windows et non le mécanisme try/catch C++. En fonction de votre fournisseur de compilateur, l'implémentation C++ ne peut pas capturer toutes les exceptions.

En code managé, en fonction de la version de la structure, il existe des exceptions non gérables. En excluant ceux-ci, vous pouvez également échouer à attraper une exception si vous ne préparez pas une région contrainte et suivez attentivement les règles CER. Aussi, comme quelqu'un d'autre mentionné, vous pouvez regarder des exceptions non gérées dans votre AppDomain. (Vous ne pouvez pas être dans un seul domaine d'application, mais cela est rare et vous sauriez probablement si vous n'étiez pas). Une autre chose à retenir dans les deux cas est que chaque thread a sa propre pile et un ensemble d'exceptions. Si vous essayez d'essayer/attraper toutes les exceptions, vous devez attraper chaque thread qui fonctionne en votre nom. Dans le code managé, le thread finalizer (thread de garbage collector qui exécute "destructeurs" ou code de finalizer) est un endroit qui est souvent manqué.

Toutefois, avant de sauter à l'un de ces deux éléments, je rechercherais une sortie de processus ou une clause de sortie sans exception.

+0

Désolé, je travaille dans le code managé. C# pour être spécifique. –

Questions connexes