À 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 est 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 autour 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; de sorte pas 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 sur elle. 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 la 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à.

  • Ce pas vraiment la pensée--oui, vous voulez probablement l'application pour quitter. MAIS, ne serait-il pas agréable à la première ouverture de session de l'exception avec ses StackTrace? Si tout que vous avez obtenu de l'utilisateur a été, "Votre demande est tombé en panne lorsque j'ai appuyé sur ce bouton, vous pouvez ne jamais être en mesure de résoudre le problème, parce que vous n'aurez pas suffisamment d'informations. Mais si vous avez d'abord enregistré l'exception avant plus agréablement l'abandon de l'application, vous aurez beaucoup plus d'informations.
  • J'ai élaboré ce point un peu dans la question maintenant. Je connais les risques encourus, et pour une application particulière, il a été jugé acceptable. Et l'abandon de la demande pour quelque chose d'aussi simple qu'un indice hors limites, tandis que l'INTERFACE utilisateur a essayé de faire quelques belles animation est excessif et inutile. Oui, je ne sais pas la cause exacte, mais nous avons des données pour sauvegarder la réclamation que la grande majorité des cas d'erreur est bénigne. Les plus graves, nous sommes de masquage peut provoquer un dysfonctionnement de l'application, mais c'est ce qui se serait passé sans mondial de gestion de l'exception de toute façon.
  • D'un autre côté remarque: si vous voulez éviter les accidents avec cette approche, les utilisateurs n'auront plus de chances d'amour il.
  • Voir Windows Manipulation des Exceptions Non gérées dans WPF (collection La plus complète de gestionnaires) de l'échantillon en C# sur Visual Studio 2010. Il a 5 exemples, y compris le domaine d'application.CurrentDomain.FirstChanceException, Application.DispatcherUnhandledException et domaine d'application.CurrentDomain.UnhandledException.
InformationsquelleAutor Joey | 2009-04-27