Quelle est la différence entre l'Application.ThreadException et domaine d'application.CurrentDomain.UnhandledException?
Bon, c'est facile:
-
Quelle est la différence entre
Application.ThreadException
etAppDomain.CurrentDomain.UnhandledException
? -
Ai-je besoin pour gérer à la fois?
Merci!
Vous devez vous connecter pour publier un commentaire.
Application.ThreadException est spécifique à Windows Forms. Winforms pistes de gestionnaires d'événements en réponse à des messages envoyés par les Fenêtres. L'événement Click pour exemple, je suis sûr que vous les connaissez. Si un gestionnaire d'événement déclenche une exception puis, il y a un arrière-stop à l'intérieur de la Winforms boucle de message que les captures de cette exception.
Que le filet de sécurité déclenche l' Application.ThreadException événement. Si vous n'avez pas le remplacer, l'utilisateur recevra un ThreadExceptionDialog. Ce qui lui permet d'ignorer l'exception et de garder l'exécution de votre programme. Pas une bonne idée btw.
Vous pouvez désactiver ce comportement en appelant Application.SetUnhandledExceptionMode() dans la méthode main() dans le Programme.cs. Sans que le filet de sécurité en place, l'habitude de chose se produit lorsqu'un thread meurt d'une exception non gérée: Domaine d'application.UnhandledException incendies et le programme s'arrête.
Fwiw: "ThreadException" était un très mauvais choix de nom. Il n'a rien à voir avec les threads.
Application.ThreadException
. J'ai soulevé une question pour ce [here] avec mon petit code C#.Dans les applications qui utilisent Windows Forms, les exceptions non gérées dans le thread principal de l'application provoquer la
Application.ThreadException
événement à être soulevée. Si cet événement est pris en charge, le comportement par défaut, c'est que l'exception non gérée ne met pas fin à l'application, même si l'application est laissée dans un état inconnu. Dans ce cas, leUnhandledException
événement n'est pas déclenché. Ce comportement peut être modifié en utilisant le fichier de configuration d'application, ou à l'aide de laApplication.SetUnhandledExceptionMode
méthode pour changer le mode deUnhandledExceptionMode.ThrowException
avant laThreadException
gestionnaire d'événement est accroché. Cela s'applique uniquement dans le thread principal de l'application. LeUnhandledException
événement est déclenché pour les exceptions non gérées jetés dans d'autres threads.De départ avec Visual Studio 2005, le Visual Basic application framework fournit un autre événement pour les exceptions non gérées dans le thread principal de l'application -
WindowsFormsApplicationBase.UnhandledException
. Cet événement est un événement arguments de l'objet avec le même nom que les arguments de l'événement objet utilisé par domaine d'application.UnhandledException, mais avec des propriétés différentes. En particulier, cet événement arguments objet a unExitApplication
propriété qui permet à l'application continue de fonctionner, en ignorant l'exception non gérée (et de quitter l'application dans un état inconnu). Dans ce cas, le domaine d'application.UnhandledException événement n'est pas déclenché.Application.ThreadException
peuvent être capturés et le application pourrait continuer (en général n'est pas une bonne idée, mais pour l'application, comme la course périodiquement certaines actions, c'est une bonne solution).Pour attraper les exceptions qui se produisent dans les threads sont pas créés et détenus par des Formes de Windows, utilisez le
AppDomain.UnhandledException
. Il permet à l'application d'enregistrer des informations sur l'exception avant le système de gestionnaire par défaut des rapports de l'exception à l'utilisateur et se termine à la demande.Le traitement de cette exception ne fait pas obstacle à l'application d'être terminé.
Le maximum qui pourrait être fait(programme de données peuvent être endommagées dans les cas d'exception non gérée) est l'enregistrement de données de programme pour la récupération ultérieure. Après que le domaine d'application est déchargé et l'application se termine.
En commençant par le .NET 4, cet événement n'est pas déclenché pour les exceptions que la corruption de l'état du processus, tels que les débordements de pile ou de violations d'accès, à moins que le gestionnaire d'événements est critique de sécurité et a la
HandleProcessCorruptedStateExceptionsAttribute
attribut.Pour plus de détails, voir MSDN.
OK - je l'ai eu en face de moi, ce morceau de code à partir de msdn est assez explicite:
Eh bien, la chose est,
ThreadException
se produit en raison d'un problème avec votre fils, leUnhandled Exception
est déclenché si vous code déclenche une exception qui n'est pas traitée.Plus faciles à causer la seconde est de créer une application sans les blocs try...catch et de lever une exception.
Maintenant, si vous avez besoin d'assurance, vous pouvez les gérer à la fois, cependant, si vous capturer et de gérer votre
exceptions
correctement, alors vous ne devriez pas avoir besoin de laUnhandledException
gestionnaire comme c'est un peu comme un fourre-tout.