Question

I possède un gestionnaire d'exception non gérée. Il montre une interface graphique agréable et permet aux utilisateurs d'envoyer un rapport d'erreur. Les utilisateurs peuvent même laisser leur nom et numéro de téléphone et les choses, et nos appels département de soutien leur dos. Fonctionne bien, semble bon, rend les clients moins en colère. En théorie, en tout cas.

Le problème est que mes application utilise des fils de fond, et les fils ne semblent pas se soucier si une exception a été lancée, par exemple, le fil GUI (ce qui est logique), et juste continuer leur travail. Que finalement les résultats dans une boîte de dialogue REH POPING si l'utilisateur permet de ma fenêtre personnalisée gestionnaire d'exception séjour ouvert assez longtemps, le faire ressembler le gestionnaire d'erreur s'écrasements.

Je n'ai accès aux objets de fil dans le champ d'application du gestionnaire d'exception, donc je ne peux pas les suspendre. Faire les objets de fil globalement accessible n'est pas une solution non plus. Ma solution est maintenant pour utiliser quelque chose comme Globals.Crashed = true; dans mon gestionnaire d'exceptions et d'avoir mes méthodes de filets.Vérifier cette propriété à chaque itération de la boucle. Pas parfait, mais il minimise les dégâts.

quiconque ne connaît une méthode moins aki? Mon tort d'approche? Dois-je faire comme REH fait et lancer un programme externe qui suspend le programme principal et montre l'interface utilisateur d'erreur?

Était-ce utile?

La solution

Si vous avez une exception non gérée, inconnu, vous pouvez supposer que quelque chose a happend et que votre programme pourrait ne pas faire même la chose la plus simple. Considérons par exemple le cas où il a consommé toute la mémoire disponible -. vous ne serez pas en mesure d'envoyer le rapport d'erreur soit, car elle nécessiterait une mémoire à allouer

Une bonne approche consiste à écrire un séparés petite application qui fait exactement le rapport d'erreurs. Cette application peut prendre les détails à partir d'un fichier rapport. De cette façon, votre gestionnaire d'exception inconnue serait:

  • Dump les informations dans un fichier dans le répertoire temporaire.
  • Lancez l'application de rapports d'erreurs avec le nom de fichier comme argument.
  • terminate le processus défaillant, avant qu'il ne quelque chose de stupide.

Le fichier temporaire doit être retiré par l'application de rapports d'erreur.

Autres conseils

Vous pourriez suivre tous vos fils dans un objet global de collecte, de sorte que lorsque votre gestionnaire de exécute, il pourrait tout simplement itérer à travers l'objet de collection et abort les fils là-bas.

Jetez un coup d'oeil au code dans cette question, Suspend processus en C # , vous ll besoin de ruser afin de ne pas suspendre votre fil de l'interface graphique et toutes celles qui ne sont pas ceux d'arrière-plan que vous avez commencé, mais il devrait faire l'affaire.

La meilleure option, cependant, est d'essayer de lancer votre interface de rapport d'erreur en tant que processus distinct, en passant toutes les informations nécessaires pour lui, puis tuer le processus original de votre gestionnaire d'exception non gérée, plutôt que de laisser quoi que ce soit à courir dans un état potentiellement corrompu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top