2010-07-24 8 views
2

Je développe une application graphique en C#.Attraper toutes les exceptions dans C#

Il est une application multithread, et je voudrais envelopper tous les fils (certains d'entre eux je ne sais pas ouvert, par exemple NetClient.StartDownload qui est une aucune fonction de blocage) avec une déclaration try/catch de sorte que si une exception est levée et non pris, je pourrais l'enregistrer et me rapporter à la base.

J'ai essayé d'utiliser Application.ThreadException et AppDomain.CurrentDomain.UnhandledException, mais ils ne semblent capturer que les exceptions d'interface graphique.

Existe-t-il une façon différente de gérer cela?

Répondre

2

La meilleure réponse est: non. Il existe déjà un système permettant de faire cela directement dans le système d'exploitation. Si vous laissez les exceptions sortir du programme, les systèmes d'exploitation modernes incluent le rapport d'erreurs Windows, qui permet à l'utilisateur d'envoyer un rapport d'erreurs à Microsoft. (pas envoyer des rapports d'erreur automatiquement - réfléchir longuement aux ramifications légales concernant les lois sur la confidentialité ...)

Le rapport d'erreurs inclut non seulement les informations d'exception et la trace de pile complète, mais inclut également une bonne partie de la mémoire de votre processus, ainsi que exactement quels modules OS ont été chargés (de sorte que vous pouvez même dire si le correctif Windows Update pertinent a été appliqué). Il encapsule toutes ces informations dans un fichier minidump (et inclut également quelques fichiers XML avec des informations supplémentaires).

Ce rapport d'erreurs est téléchargé sur les serveurs de Microsoft, vous n'avez donc pas à vous inquiéter de la configuration et de la maintenance d'un serveur "d'appel". Tous les rapports d'erreurs pour vos programmes sont catégorisés en utilisant des heuristiques avancées dans des «compartiments», chaque «compartiment» contenant des rapports susceptibles d'être causés par le même bogue.

Microsoft vous expose toutes ces informations (en tant qu'éditeur de logiciels) via un site appelé Winqual. À l'aide de Winqual, vous pouvez examiner tous les rapports d'erreurs et utiliser leurs algorithmes de recherche heuristique pour déterminer quels bogues ont le plus d'impact sur vos clients. Vous pouvez également télécharger chaque rapport individuel pour une analyse plus détaillée.Si vous avez un serveur de symboles et un serveur de contrôle de source configurés dans votre organisation (et vous le devriez certainement), vous pouvez simplement charger le minidump à partir d'un rapport d'erreur téléchargé directement dans Visual Studio, et il vérifiera automagiquement l'ancien source hors du contrôle de la source et vous permettent d'inspecter l'état exact du programme au moment où il s'est écrasé.

Trouver et réparer des bogues n'a jamais été aussi simple.

Pour résumer, voici ce que vous devez faire:

  1. Mettre en place un symbol server et un serveur source dans votre organisation. Établissez une stratégie de publication pour vous assurer que toutes les versions obtiennent source-indexed pdbs ajouté au serveur de symboles avant d'être mises à la disposition du client.
  2. Établissez un compte avec Winqual. Vous aurez besoin d'un certificat de signature de code Authenticode; Si vous obtenez un certificat de signature de code autre que VeriSign, vous devrez également débourser 100 $ pour un «certificat d'organisation» auprès de VeriSign.
  3. Modifiez votre stratégie de publication pour inclure la création de fichiers de mappage pour vos versions. Ces fichiers de mapping sont téléchargés sur Winqual avant l'expédition de la version.
  4. Ne pas attraper des exceptions inattendues. Si vous avez besoin de les attraper, assurez-vous de les relancer en utilisant throw et non throw ex, afin que la trace de la pile et l'état du programme original soient conservés.

Pour plus d'informations, je peux recommander fortement Debugging .NET 2.0 Applications par John Robbins. Malgré le "2.0" dans le titre, ce livre est toujours tout à fait pertinent aujourd'hui (sauf que le seul exemple de serveur source utilise Visual SourceSafe, qui était une blague complète même à l'époque). Un autre bon livre si vous devez faire beaucoup de débogage est Advanced .NET Debugging, bien qu'il commence à montrer son âge, d'autant plus que les nouvelles avancées de débogage VS2010 rendent beaucoup de ses techniques obsolètes.

5

Le code dans chaque thread devrait avoir un try-catch. Les exceptions ne sont pas rassemblées entre les threads ... et une exception non gérée n'apporte que l'application .

Pour attraper toutes les exceptions - utilisez simplement le type d'exception de base.

catch(Exception e) { // log e } 

Mise à jour: Vous pouvez jeter un oeil à AppDomain.UnhandledException - gérer cet événement pour la connexion des exceptions non gérées sur un thread; Cependant, vous ne pouvez pas empêcher l'application de tomber. Pour plus d'informations, consultez http://www.albahari.com/threading/#_Introduction - vers la fin de cette page.

+0

@ 0xA3 - corrigé .. merci. – Gishu

0

Nous devons attraper des exceptions à la plus petite unité possible. Comme mentionné par Gishu, les exceptions qui se produisent dans les threads ne sont pas propulsées dans le thread principal dans de nombreux cas.

j'avais blogué sur une expérience similaire il y a quelque temps à WCF service unhandled exception error

Questions connexes