J'ai un comme vous pouvez le voir, le maintenant, jusqu'à présent si bon. Mon application fonctionne bien et si je rencontre un crash, la dernière exception code> code> doit être capturée par le bloc code> track code> et stocké dans le fichier journal d'erreur. P> Cependant, comme je cours mon programme pendant un moment, je reçois une exception non gérée ( maintenant, Ce message montre qu'il est éventuellement causé par pourquoi serait-ce? p> < / p> winform code> écrit dans
c # code> où je place un
try-attraper code> bloc dans le
programme.cs code>, dans la saisie du programme, la méthode code> statique (code> statique code>, juste au début de l'application, comme ceci:
Application code> est placé dans un
try-attrayez CODE> bloc et dans le bloc code> code>, la seule chose que cela fait est de créer un fichier journal d'erreur. P >
null code> référence). Quelle surprise moi est que l'exception ne crée pas de fichier journal d'erreur. P>
threadexception code> ou
guidageProcessancorruptedstatexceptions code> (Les deux réponses les plus avancées), mais mon cas montre une simple exception de référence code> null p>
3 Réponses :
Cet événement permet à votre application Windows Formulaires de gérer le contraire
Des exceptions non confondues qui se produisent dans Windows forment des threads P>
blockQuote>
Cela signifie qu'il gère des exceptions dans des threads autres que le fil principal. p>
Alors, vous devez vous abonner à: AppDomain.CurrentDomaine.UnhandledException Aussi pour gérer les exceptions dans votre thread principal (quel que soit le type de l'exception, par exemple threadexception code> n'est pas un type d'exception comme (
NullReferenceException code>). C'est que: p>
NullReference code>,
indexautofrange code>, etc ..). P>
OK, dans la fin I Mettre en place aussi, il semble que la source de confusion ici est qu'il y a réellement deux PROPAGÉES La première a été une exception de l'application elle-même: p> Application.setUnhandleXceptionMode (Non gredexceptionMode.ththrowException) Code> Comme examinée par Hans Passant pour
vb.net code> in ce message . Ici, je mets mon propre code + journalisation des erreurs pour
C # code>:
EXCEPTIONS CODE> se produisent: P>
System.NullReferenceException: Object reference not set to an instance of an object.
at T5ShortestTime.T5ShortestTimeForm.Dispose(Boolean disposing)
at System.ComponentModel.Component.Finalize()
La dernière exception doit être capturée par le bloc Try-Catch P>
ça ne va pas arriver. Sauf dans un cas, lorsque vous exécutez votre programme avec un débogueur attaché. Donc, vous avez sûrement été balayée pour croire que cela fonctionnerait, tout le monde commence toujours à exécuter son programme avec F5 pendant un certain temps. P>
Application.Run () a une back-stop dans son code qui soulève des événements, essayez / Catch-EM-Tout ce qui augmente l'application.threadException lorsqu'un manipulateur d'événements jette une exception non gérée. Ce back-stop est vraiment, vraiment em> nécessaire, surtout sur la version x64 de Windows 7. Très mauvaises choses arrivent quand il n'y a pas de gestionnaire d'exception. Ce back-shirt n'est cependant pas en place lorsque vous courez avec le débogueur, qui rend les exceptions non difficiles trop difficiles à déboguer. P>
Ainsi, lorsque vous débogez, votre clause Catch em> sera exécutée. Faire des exceptions non difficiles trop difficiles à déboguer. Lorsque vous courez sans débogueur, votre clause de capture sera pas em> la course et votre programme se bloquera, tout comme vous l'avez décrit. Faire une exception non difficile trop difficile à déboguer. P>
Alors ne le fais pas de cette façon. Comment Application.Run () traite des exceptions non conventionnelles est configurée avec la méthode Application.setUnhandleXceptionMode (). Vous aimerez la version meilleure: p>
xxx pré> avec ce code en place, vous pouvez déboguer des exceptions non heurtées sans aucun problème. Le test de débogueur.Sattachis garantit que le débogueur s'arrêtera toujours quand un gestionnaire d'événements tombe dessus. Sans débogueur, il désactive ensuite l'événement Application.ThreadException (il est assez inutile) et favorise l'écoute de toutes les exceptions fortes>. Y compris ceux soulevés dans des threads de travailleurs. P>
Vous devez donner une alerte à l'utilisateur afin que la fenêtre ne disparaisse donc pas sans aucune trace. J'allais recommander à MessageBox mais a remarqué que Ce bug a > est actuellement de retour sur Windows 10. soupir. P> BlockQuote>
Merci pour l'explication, cela devrait être la réponse. Une dernière question, vous dites que c'est particulièrement mauvais pour Windows 7 X64, j'utilise Windows 10 X64. Est-ce que cela fait de la différence? Dans votre message, vous avez déclaré: "Mise à jour vers Windows 8 ou ultérieure, elles ont résolu ce problème WOW64." - Je suppose que cela s'applique aussi à Windows 10, est-ce correct?
Win10 n'a pas ce problème, il est très spécifique à Win7.
D'accord merci. Ensuite, j'aurai la paix à l'esprit ...;) Je remarque également que le Dispose code> est toujours appelé après i> l'exception
code>. Je implémente le
setunhandleexceptionMode code> à
thorteException code>, je l'ai testé avec un
lancer un nouveau système.Exception () code>. Étonnamment, le programme génère des fichiers journaux d'erreur deux i> à la fois un i>. L'un est le
system.exception code>, et l'autre est l'exception code> code> dans le
Dispose code> - et celui dans le
Dispose code > est produit plus tard i>. Pourquoi cela est-il ainsi? Est-ce que cela s'attendait à ce que le
Dispose code> est toujours appelé après i> une exception fatale?
Il n'est pas très clair de ce qui dispose de la méthode dont vous parlez. Vraisemblablement, il s'agit en réalité de la surcharge (BOOL), elle est également appelée par le finaliseur. Vous devez choisir comment vous terminez votre programme, Environnement.exit () Nettoie toujours les finaliseurs en cours d'exécution, Environnement.Failfast () ne le fait pas. Disposer (Bool) ne doit pas faire quoi que ce soit de dangereux lorsque l'argument disposant i> est faux, vous ne voulez jamais planter le fil du finaliseur. Si cela n'aide pas, cliquez sur le bouton Posez une question.
L'explication dans le commentaire est utile. Il semble que la seconde exception code> code> est causée par l'environnement .exit code>. Quand je n'ai pas mis le
environnement.exit code> mais remplacez par
environnement.failfast code> (et oui, il s'agit du paramètre sans paramètre i>
disposer < / Code> avait par le
Winform code>), le programme a fait pas i> produit deux journaux. Je m'attendrais également à ce que cela ferait la même chose si
appdomain.currentdomaine.unhandledexception - = logexception; code> est utilisé. Merci encore! ;)
Ce n'est pas la façon dont vous créez un gestionnaire d'exception global. Regardez à droite de cette page, dans la section «liée». La réponse acceptée Il vous dit quoi faire.
@jmcilhinney Vous voulez dire
threadexception code>?
Dans l'exemple, il y a // démarrez un nouveau thread, séparé des formulaires Windows, qui lancera une exception.
Void privé Bouton2_Cliquez sur System.eventargs E) {Threadstarg NewThreadstart = Nouveau threadstart (NewTread_execute); NEWTHEAD = nouveau thread (NewToidsStart); NEWTTHEAD.START (); } code> qui gère délibérément une exception dans un nouveau fil. Mais cela peut créer une exception de référence code> null code> (comme mon cas) au lieu de
threadexception code> (supposé être ce type - n'est-ce pas?)?