262 votes

À l’échelle mondiale, intercepter des exceptions dans une application WPF ?

Nous sommes d'avoir une application WPF zones où il peut lancer des exceptions à l'exécution. J'aimerais à l'échelle mondiale attraper une exception non gérée et journal, mais en tout cas de poursuivre l'exécution du programme comme si de rien n'était (un peu comme VB de l' On Error Resume Next).

Est-ce possible en C#? Et si oui, où exactement, ai-je besoin de mettre le code de gestion des exceptions?

Actuellement je ne vois pas un seul point où je pouvais emballer un try/catch environ et qui permettrait d'intercepter toutes les exceptions qui pourraient se produire. Et même alors je l'ai laissé tout ce qui a été exécuté en raison de la capture. Ou suis-je en pensant à mal les directions ici?

ETA: Parce que beaucoup de gens au-dessous de l'a signalé: L'application n'est pas pour le contrôle des centrales nucléaires. Si il plante, il n'est pas beaucoup d'une grosse affaire, mais au hasard des exceptions qui sont pour la plupart liées à l'INTERFACE utilisateur sont une nuisance dans le contexte où il sera utilisé. Il y avait (et probablement encore) un peu de ceux-ci et depuis il utilise une architecture de plugin et peut être prolongé par d'autres (également les étudiants dans ce cas; donc pas de développeurs expérimentés qui sont capables d'écrire complètement exempt d'erreurs de code).

Comme pour les exceptions coincés: je ne les enregistre dans un fichier journal, y compris la trace de la pile complète. Qui a été le point de l'ensemble de l'exercice. Juste pour contrer ces gens qui ont été en prenant mon analogie à VB de OERN trop littéralement.

Je sais que l'aveuglette en ignorant certaines classes d'erreurs est dangereux et peut corrompre mon instance de l'application. Comme dit précédemment, ce programme n'est pas critique pour n'importe qui. Personne dans leur bon esprit pari de la survie de la civilisation humaine. C'est tout simplement un petit outil qui permet de tester certaines des approches de conception wrt. génie logiciel.

Pour l'utilisation immédiate de l'application il n'y a pas beaucoup de choses qui peuvent se produire sur une exception:

  • Pas de gestion des exceptions – dialogue d'erreur et la fermeture de l'application. L'expérience doit être répétée, bien que probablement avec un autre sujet. Aucune erreur n'a été enregistré, ce qui est regrettable.
  • Générique de gestion des exceptions – bénigne erreur interceptée, pas de dégâts. Ce devrait être le cas le plus courant jugé à partir de toutes les erreurs, nous avons pu assister au cours du développement. Le fait d'ignorer ce genre d'erreurs devraient pas avoir de conséquences immédiates; les structures de données de base sont bien testé assez facilement survivre à ça.
  • Générique de gestion des exceptions – grave erreur interceptée, éventuellement bloquer à un moment plus tard. Cela peut se produire rarement. Nous n'avons jamais vu ça jusqu'à présent. L'erreur est quand même enregistré et un accident est peut-être inévitable. Donc, c'est conceptuellement similaire à la première affaire. Sauf que nous avons une trace de la pile. Et dans la majorité des cas, l'utilisateur ne remarquerez même pas.

Comme pour l'expérience des données générées par le programme: Une grave erreur, au pire, juste cause, aucune donnée ne sera enregistrée. De subtils changements qui modifient le résultat de cette expérience un tant soit peu sont assez improbable. Et même dans ce cas, si les résultats semblent douteux, l'erreur a été enregistrée; on peut encore jeter ce point de données si c'est un total de valeurs aberrantes.

Pour résumer: Oui, je me considère toujours, au moins partiellement, sain d'esprit et je ne considère pas une exception mondial d'une routine de gestion qui quitte le programme en cours d'exécution à être nécessairement totalement mal. Comme l'a dit deux fois auparavant, une telle décision peut être valide, en fonction de l'application. Dans ce cas, il a été jugé valide décision et de ne pas totale et absolue de la connerie. Pour toute autre demande que la décision soit différent. Mais merci de ne pas m'accuser ou de l'autre des gens qui ont travaillé sur ce projet pour potentiellement faire sauter le monde, juste parce que nous sommes en ignorant les erreurs.

Note de côté: Il y a exactement un utilisateur pour cette application. Ce n'est pas quelque chose comme Windows ou Office qui est utilisé par des millions de personnes, où le coût d'avoir des exceptions bulle à l'utilisateur serait très différente, en premier lieu, déjà.

204voto

David Schmitt Points 29384

Utiliser l' Application.DispatcherUnhandledException Event. Voir cette question pour un résumé (voir Drew Noakes de réponse).

Être conscient qu'il y aura toujours des exceptions, qui s'opposent à une réussite de la reprise de votre application, comme après un débordement de pile, épuisé de mémoire, ou de la perte de la connectivité réseau pendant que vous êtes en essayant de sauver de la base de données.

19voto

Hertzel Guinness Points 2983

Par ailleurs ce que d’autres mentionnés ici, Notez que la combinaison du `` (et ses semblables) avec

dans le fichier app.config empêchera votre exception threads secondaires de fermer l’application.

-1voto

Russ Points 1498

Cette ne pensée pas vraiment--Oui, que vous voulez probablement la demande pour sortir. MAIS, ne serait-il pas agréable d’abord enregistrer l’exception avec ses StackTrace ? Si tout ce vous avez obtenu de l’utilisateur était, « Votre application s’est écrasée quand j’ai appuyé sur ce bouton », vous peut-être jamais en mesure de résoudre le problème parce que vous n’aurais pas suffisamment d’informations. Mais si vous d’abord connecté l’exception avant de plus agréablement terminer l’application, vous aurez beaucoup plus d’informations.

-4voto

BobbyShaftoe Points 19925

Comme "VB de on Error Resume Next?" Que cela peut sembler un peu effrayant. La première recommandation est de ne pas le faire. Deuxième recommandation est de ne pas le faire et de ne pas y penser. Vous souhaitez isoler vos défauts mieux. Pour l'approche de ce problème, il dépend de la façon dont vous êtes le code est structuré. Si vous utilisez un modèle de type MVC ou alors ce ne devrait pas être trop difficile et serait certainement pas besoin d'un global d'exception avaleuse. Deuxièmement, pour trouver un bon bibliothèque de journalisation comme log4net ou utiliser le suivi. Nous aurions besoin de connaître plus de détails comme ce type d'exceptions dont vous parlez et ce que les parties de votre application peut entraîner l'exception levée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X