Puis-je créer un gestionnaire global d'exception en C# qui permet au code de continuer à exécuter par la suite?
.NET, le gestionnaire d'exceptions par défaut pour permettre à l'utilisateur de continuer l'exécution du programme. Cependant, j'aimerais avoir un gestionnaire global d'exception qui enregistre la trace de la pile pour un "errorlog.txt" fichier de sorte que l'utilisateur peut envoyer à moi et ne pas oublier de cliquer sur "Détails" et la copie de la boîte de dialogue (et supprimer toutes les choses inutiles sur chargé des assemblées et autres). Mais quand je fais cela, le code ne sais pas comment continuer, donc tout ce que je peux faire est de quitter l'application. Est-il possible d'avoir le meilleur des deux mondes? (Oui, je sais ce que je demande, c'est essentiellement "on Error Resume Next" avec l'exploitation forestière, mais je pense vraiment qu'il serait utile!)
msdn.microsoft.com/en-us/library/....
Comment votre votre application continue de fonctionner après un abandon de thread ou une exception de violation d'accès?
Ou, peut-être un Débordement de la Pile? 😉
double possible de Est-il possible de continuer l'exécution du code à partir du point de rupture?
OriginalL'auteur ekolis | 2013-09-24
Vous devez vous connecter pour publier un commentaire.
Vous pouvez écrire un gestionnaire d'exception méthode que vous appelez dans tous les
catch
bloc, qui enregistre la trace de la pile à l'endroit où vous souhaitez l'enregistrer. Mais vous auriez besoin d'écriretry . . . catch
blocs pour chaque opération qui a besoin d'eux et de les appeler le gestionnaire d'exception chacun.Vous pouvez également appeler que le gestionnaire global d'exception à la méthode d'
MyApplication.UnhandledException
gestionnaire pour tous les non gérée événements. Mais lorsqu'une commande arrive à cette méthode, dans ce cas, le programme ne va pas continuer à fonctionner.Juste pour remarque, vous pouvez continuer l'exécution par le paramètre "Traitées" à vrai dans le cas de l'arg. Votre application peut être dans un drôle d'état, bien sûr, mais vous pourriez en théorie récupérer.
OriginalL'auteur Tony Vitabile
Si vous liez-vous à cet événement lors du démarrage de l'application, vous devriez être en mesure d'attraper une Exception non Gérée votre application génère, et de l'enregistrer dans un fichier. (Utiliser le
Exception
partie de l'objet de laUnhandledExceptionEventArgs
. Je ne crois pas qu'il est possible de reprendre à partir de l'endroit où l'erreur s'est Produite.OriginalL'auteur Samuel
Aucun qui n'existe pas, les exceptions sont un flux de contrôle de la construction, de sorte
On Error Resume Next
n'est pas possible.Vous pourriez faire votre opération en boucle et sur une exception, recommencez votre logique.
KandallFrey est en droit cependant, vous ne devriez pas utiliser des exceptions comme le contrôle de flux, de les utiliser uniquement dans des cas exceptionnels.
je ne dis pas qu'ils peuvent être utilisés comme contrôle de flux, mais ce qu'ils sont.
Je ne suis pas les utiliser pour le contrôle de flux. Je les utilise pour traiter les cas exceptionnels, mais je ne veux pas l'application pour être en mesure de récupérer gracieusement, tout en continuant l'enregistrement de l'erreur.
OriginalL'auteur Daniel A. White
- Je utiliser
My.Application.UnhandledException
pour ouvrir une fenêtre de dialogue où l'utilisateur peut enregistrer toutes les informations au sujet de l'exception.Lorsque le formulaire est fermé, j'ai appeler
e.ExitApplication = False
.Oui, vous avez raison. Pour C# les utilisateurs, j'ai trouvé ceci: msdn.microsoft.com/it-it/library/...
OriginalL'auteur tezzo
Dans une Winform application, vous pouvez joindre un gestionnaire à l'
Application.ThreadException
événement (assurez-vous de le faire avant d'appelerApplication.Run()
). Cela permettra de se débarrasser de la norme exception de dialogue (l'un avec le bouton "détails") et de vous donner la puissance pour afficher /enregistrer tout ce que vous voulez.Cependant, rappelez-vous que cela va fonctionner SEULEMENT pour les exceptions levées dans le thread de l'INTERFACE utilisateur. Les Exceptions soulevées à partir d'un thread d'arrière-plan ne sera pas accessible à partir de votre gestionnaire. Ceux-ci peuvent encore être pris par
AppDomain.UnhandledException
gestionnaire.OriginalL'auteur Crono
principal constructeur, le mettre et de le faire à l'échelle mondiale:
OriginalL'auteur T.Todua
De mon cabinet, j'ai construit une exception cadre de traitement qui m'a bien servi pendant 7 ans maintenant. Toutes les références d'assembly de la DLL, et chaque méthode dans chaque assemblée dispose d'un bloc try-catch. Dans le catch, j'ai pratiquement à rendre une décision sur la base de la question: "où veux-je que mon traitement d'exception cadre d'intervenir, c'est à dire pour enregistrer l'exception des données en externe et en informera l'utilisateur du problème?". Dans la plupart des cas, la réponse à cette question est que je veux intervenir dans les cas où la méthode est appelée de l'extérieur, par exemple si c'est à l'intérieur d'un gestionnaire d'événement ou un autre délégué. Voici donc un exemple de code:
Quand
Throw BSExceptionHandler.GetBSException(ex, BSExceptionHandler.GetThisMethodName)
est appelé pour la première fois dansMethod2()
, à l'exception d'origine est enveloppé à l'intérieur d'unBSException
, et l'origine du nom de la méthode est stockée en tant que bien (plus sur cela plus tard). Les appels suivants àBSExceptionHandler.GetBSException(ex, BSExceptionHandler.GetThisMethodName)
, par exemple, dansMethod1()
, de reconnaître que l'exception est déjà de typeBSException
et il suffit de jeter que, au lieu de ré-emballage. En fin de compte, il atteint le "top" de la pile d'appel (pas vraiment le top, juste au point où je l'ai décidé, je veux processus de l'exception par le biais de mon framework -- un journal, d'en informer l'utilisateur, etc.) - dans ce cas, enButton1_Click
-- et puisBSExceptionHandler.ProcessException(BSExceptionHandler.GetBSException(ex, BSExceptionHandler.GetThisMethodName))
est appelé.Ce que mon cadre n'en
ProcessException
est de déterminer le type de rapports configurés sur le système. Cette valeur par défaut est "simple", ce qui signifie que l'utilisateur obtient une très général et peu intrusif boîte de dialogue indiquant qu'un problème est survenu et leur demandant de contacter le département informatique. Cependant, il y a une option de paramètre de registre qui permettra de définir le type de rapport, soit de "commentaires" ou "e-mail". J'utilise de "commentaires" sur ma machine de développement, parce qu'elle inclut toutes l'exception de l'info dans la boîte de dialogue, donc je n'ai pas à aller regarder le journal. Le "e-mail" est utilisé sur les serveurs où j'ai des applications en cours d'exécution lorsque aucun utilisateur n'est connecté; dans ce cas, les informations d'erreur est envoyé par le département pour les avertir de la question.L'autre chose qui se passe à partir de là, quel que soit le type de rapport, est que l'erreur des informations enregistrées dans le journal des événements Windows. Voici un exemple:
Lorsque l'utilisateur signale le problème à ELLE, tout ce qu'IL a à faire est de vérifier leur journal des événements pour obtenir l'erreur info. En outre, l'application ne se ferme pas; elle continue de fonctionner , car il ne permet à l'exception de la bulle jusqu'à l'extérieur de l'endroit où vous avez choisi de traiter l'exception avec le cadre de traitement des. Une fois qu'il est manipulé par le cadre, c'est fait.
Bien qu'il existe quelques inconvénients à cette approche, j'ai trouvé ça extrêmement robuste système et il m'a sauvé de nombreuses de nombreuses heures de dépannage à l'aveuglette au fil des ans. J'ai créé des extraits de sorte que tout ce que j'ai à faire est de créer un bloc try-catch puis tapez l'extrait de raccourci (par exemple, "pbs" ou "sct" -- dans le fourre-bloquer et frapper la touche de tabulation pour remplir l'exception appropriée de la méthode de gestion. Par conséquent, il est tout à fait indolore pour l'utilisation de ce cadre de chaque méthode. J'ai encore modifié mon VS les modèles de projet toujours de référence et sont le cadre, donc je ne pas avoir à le faire pour chaque nouveau projet.
Donc, concernant la
GetThisMethodName()
fonction: cette méthode utiliseSystem.Diagnostics.StackTrace
,System.Diagnostics.StackFrame
, etSystem.Reflection.MethodBase
trouver le nom de la méthode où l'exception d'origine a été enveloppé à l'intérieur du BSException.Je ne recommanderais pas cette approche. Seul hic, les exceptions que vous allez réellement à gérer, c'est à dire répondre avec un peu de logique d'action, par exemple, de réessayer de les enregistrer dans la base de données ou d'essayer d'ouvrir le fichier verrouillé de nouveau. Si tout ce que vous faites est l'enregistrement de l'exception alors un gestionnaire global d'exception et de l'enregistrer il y a (peut-être utiliser log4net). Vous pouvez même prendre une décision de commencer à traiter de certains de ces auparavant, les exceptions non gérées
Vous l'avez dit, "Seulement attraper les exceptions que vous allez réellement à gérer": avez-vous quelque chose de fond qui peut sauvegarder cette demande?
Aussi, l'on a accepté la réponse est en gros ce qui suggère la même approche, mais avec beaucoup moins de détails.
SleepyBoBos est absolument droit. La capture de tous les possibles
Exception
quelle que soit sa nature signifie que les instances de l'objet peut rester dans un état endommagé, ce qui peut causer d'autres, BEAUCOUP plus difficile erreurs de débogage et - pire que tout - la perte de données causée inexacte de vérifier les conditions (causé par la corruption de l'état).OriginalL'auteur rory.ap