Comment mettre en œuvre un “catch em all” gestionnaire d'exception avec le résumé?
Je me demande comment puis-je écrire un catch em all gestionnaire d'exception au niveau de l'application qui va donner à l'utilisateur la possibilité de reprendre le flux de l'application?
Vous devez vous connecter pour publier un commentaire.
Si vous exécutez une application Windows Forms: ajouter un gestionnaire à l'
Application.ThreadException
événement.Je suppose que vous écrivez une application Windows dans ce cas, oui, vous pouvez le faire. Je vais laisser les droits et les torts de savoir si vous devriez ou non à d'autres. Il y a déjà assez de réponses qui regarde cela et je vous suggère de étudiez-les attentivement avant de vous faire cette.
Noter que ce code va se comporter différemment dans le débogueur que si vous exécutez l'application directement (une autre raison de ne pas le faire peut-être). Afin d'obtenir l'application pour afficher la boîte de message et de continuer par la suite vous aurez besoin pour exécuter l'application à partir de l'explorateur, pas à partir de visual studio.
Créer une nouvelle application Windows forms. Le code du Programme.cs ressemble à quelque chose comme ceci:
Puis faire le code de Form1 ressembler à quelque chose comme ceci:
(Ajouter button1 pour le formulaire et le joindre button1_Click.)
Cela dépend de ce que tu veux dire par "reprendre". Le problème avec les exceptions est que si vous êtes très attention, le temps d'une exception se produit, votre état de l'application est très probablement corrompu, vous pourriez avoir terminé la moitié une opération.
Si vous pouvez isoler vos opérations - un peu comme une base de données des isolats de transactions - ensuite, vous pouvez effectivement permettre à l'utilisateur de reprendre à partir de l' "dernier point de validation". Que dépendra en grande partie du type de votre application si. Pourriez-vous nous donner plus de détails sur le type d'application que vous êtes en train de construire?
Utilisez code ci-dessous dans votre programme.cs de la classe. Il va automatiquement Envoyer un mail lorsqu'une exception se produit.
Je ne pense pas que ce soit vraiment réalisable à l'aide d'un gestionnaire d'erreurs globales. Vous avez besoin de comprendre à quel type d'erreurs sont récupérables à différents points dans votre application et écrire des gestionnaires d'erreur à l'adresse erreurs lorsqu'elles se produisent, à moins que vous voulez recourir à l'redémarrage de l'application, qui peut ou peut ne pas fonctionner selon ce qui est l'erreur réelle. Afin de faire toute sorte de résumé, vous aurez besoin d'économiser suffisamment d'état à redémarrer dans un bon état.
Vous devriez lire sur tous les problèmes liés à VB de "
On Error Resume Next
" style d'erreur de manipulation. Il semble que vous essayez de mettre en œuvre ce pour C#.Même si vous pouvez reprendre à partir du point où l'exception est générée, c'est une fracture de la technique pour la gestion des erreurs. Il n'y a aucun moyen pour un mondial gestionnaire pour être réellement en mesure de gérer toute erreur/exception - qu'il ne peut pas savoir ce qui est nécessaire pour n'importe quelle situation.
Vous devez définir une sorte de variable globale, et ont la canalisation principale code continuellement vérifier les indications d'erreur (ie., utiliser le VB technique).
Je pense que le mieux que vous pouvez faire pour se remettre d'une erreur de ce type que vous décrivez est d'attraper l'exception au niveau de l'application, connectez-vous le problème, informer l'utilisateur (et potentiellement générer/envoyer une sorte de rapport de problème pour vous), et redémarrez l'application. Bien sûr, si vous attrapez l'exception plus proche de la zone à problème, ce gestionnaire a une chance de faire quelque chose d'un peu plus intelligent, de sorte que vous ne devriez pas compter sur l'application gestionnaire de niveau comme d'une béquille, comme un fail-safe.
Dans certaines versions de .NET, vous pouvez effectivement mettre un catcher autour de l'Application.Run() (que vous trouverez dans ce programme.cs) et cela doit attraper tous les Thread Principal est toutefois des exceptions dans la plupart des cas, cela peut-être une mauvaise conception et l'habitude de vous donner beaucoup de la possibilité de "reprendre".
En plus, vous aurez toujours manuellement la poignée de toutes les exceptions sur les threads d'arrière-plan.
Vous pouvez concevoir une application de "catch all" et afficher un message d'erreur courants et les informations de débogage, c'est très bien aussi longtemps que vous le quitter par la suite. Ce qui est très déconseillé est de faire un "résumé" à la disposition de l'utilisateur, comme ce sera probablement vous donner le plus de problèmes dans le long terme.
- Ce juste des cris mauvais design tous plus. N'utilisez jamais d'exceptions pour des choses comme cela. Les Exceptions doivent être utilisés UNIQUEMENT lorsque quelque chose le programmeur n'a pas l'intention de se fait.
Si vous voulez de gestion des erreurs. ne pas utiliser les exceptions de ce genre, rahter de construire un système où vous enregistrez les états et peuvent revenir aux états, etc... mais l'utilisation d'exceptions pour la gestion des états, mauvaise idée.