2010-04-13 8 views
3

Je souhaite obtenir la boîte de dialogue Unformed-Exception Windows Forms par défaut lorsque mon application C# rencontre U-E. En 2005 vs quand je désactiver le débogage jit dans app.conf comme ceci:Boîte de dialogue Windows Forms Unhandled-Exception

<configuration> 
    <system.windows.forms jitDebugging="false" /> 
<configuration> 

l'application se comporte correctement et montre Windows Forms dialogue par défaut U-E, avec Continuer, Quitter, appeler pile et tout.

Cependant dans vs 2008, sur la même machine ou différent, même si je diable jit je reçois toujours la boîte de dialogue Default .NET Unhandled-Exception, avec les boutons Debug, Send Report et Do not Send.

Comment puis-je faire en sorte que mon application 2008 ressemble à celle que je crée en 2005, pour afficher la boîte de dialogue Windows Forms U-E?

S'il vous plaît ne recommande pas d'utiliser

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

juste parce que je ne l'utilise gestionnaire personnalisé dans mon projet vs 2005, pourquoi devrais-je utiliser dans vs 2008? Je veux laisser ce travail faire CLR.

Toute aide est appréciée

Répondre

11

Vous parlez de différentes fonctions de gestion des exceptions. Le ThreadExceptionDialog que vous voyez avec les boutons Quitter et Continuer est déclenché par le Application.ThreadException event. Il n'apparaîtra que si l'exception se produit sur le thread d'interface utilisateur lorsqu'un gestionnaire d'événements qui s'exécute en réponse à un message Windows lève une exception. Toute exception dans un thread de travail bombardera cependant le programme via AppDomain.UnhandledException.

Vous ne pouvez pas gérer ce dernier, le programme est mort et ne peut pas continuer. L'affichage de ThreadExceptionDialog est inutile.

Vous pouvez rendre la bombe du programme cohérente en désactivant l'événement ThreadException en appelant Application.SetUnhandledExceptionMode(). Maintenant, chaque exception non gérée déclenchera AppDomain.UnhandledException et terminera le programme. Ce n'est probablement pas ce que vous voulez mais c'est le bon choix.

Notez également que l'événement ThreadException est désactivé lorsque vous exécutez le programme avec un débogueur. Ce qui est probablement pourquoi vous voyez une différence dans VS2008. Sinon, il n'y a eu aucun changement.

+0

Eh bien, je n'ai que le fil de l'interface utilisateur dans mon application. Fondamentalement, par exemple, je viens de créer une nouvelle application exemple à partir de zéro et ajouté seulement nullreferenceexception dans le constructeur de formulaire. J'avais essayé de jouer avec Application.SetUnhandledExceptionMode() sans aucune différence. Une note plus importante que je ne teste pas sur la machine avec le débogueur mais dans le PC de terrain, sans tel. Je crois comprendre que VS2008 ajoute un mécanisme d'enfilage transparent qui m'empêche de voir ce que je veux voir. – Pablo

+0

Une exception dans le constructeur de formulaire bombardera AppDomain.UnhandledException, la boucle de message n'a pas encore été démarrée. VS2008 ou .NET 3.5 n'a rien ajouté de transparent. Vous ne savez pas ce que vous voulez voir, mais consigner l'exception dans un gestionnaire d'événements AppDomain.UnhandledException est important pour savoir ce qui s'est mal passé. Vous devez vraiment faire ce que vous ne voulez pas recommandé. –

+0

vous avez raison Hans, l'erreur est non UI (UnhandledException) lorsqu'il est lancé à partir du constructeur et c'est le type de thread UI principal (ThreadException) lorsqu'il est lancé à partir de n'importe quel endroit dans ui. Donc, pour ThreadException, j'ai réussi à obtenir le ThreadExceptionDialog. Vos réponses ont beaucoup aidé, dommage que je ne puisse pas voter maintenant! – Pablo

Questions connexes