Quelle est la différence entre L'Application.ThreadException et AppDomain.CurrentDomain.UnhandledException?

D'accord, c'est facile:

  • Quelle est la différence entre Application.ThreadException et
    AppDomain.CurrentDomain.UnhandledException?

  • Dois-je gérer les deux?

Merci!

98
demandé sur serhio 2010-01-06 19:48:05

4 réponses

Application.ThreadException est spécifique aux formulaires Windows. Winforms exécute des gestionnaires d'événements en réponse aux messages qui lui sont envoyés par Windows. L'événement Click par exemple, je suis sûr que vous les connaissez. Si un tel gestionnaire d'événements lance une exception, il y a un back-stop dans la boucle de message Winforms qui attrape cette exception.

Ce backstop déclenche l'Application .ThreadException événement. Si vous ne le remplacez pas, l'utilisateur obtiendra un ThreadExceptionDialog . Qui lui permet d'ignorer l'exception et de continuer à exécuter votre programme. Pas une bonne idée btw.

Vous pouvez désactiver ce comportement en appelant Application.SetUnhandledExceptionMode () dans la méthode Main() du programme.cs. Sans ce backstop en place, la chose habituelle se produit quand un thread meurt d'une exception non gérée: AppDomain.UnhandledException se déclenche et le programme se termine.

Fwiw: "ThreadException" était un très mauvais choix de nom. Il n'a rien à voir avec threads.

94
répondu Hans Passant 2014-04-25 07:02:43

Dans les applications qui utilisent Windows Forms, les exceptions non gérées dans le thread principal de l'application Application.ThreadException événement à soulever. Si cet événement est géré, le comportement par défaut est que l'exception non gérée ne met pas fin à l'application, bien que l'application reste dans un état inconnu. Dans ce cas, l'événement UnhandledException n'est pas déclenché. Ce comportement peut être modifié à l'aide du fichier de configuration de l'application ou à l'aide de la méthode Application.SetUnhandledExceptionMode pour changer le mode en UnhandledExceptionMode.ThrowException avant que le gestionnaire d'événements ThreadException ne soit connecté. Ceci s'applique uniquement au thread d'application principal. L'événement UnhandledException est déclenché pour les exceptions non gérées lancées dans d'autres threads.

À partir de Visual Studio 2005 , le cadre d'application Visual Basic fournit un autre événement pour les exceptions non gérées dans le thread d'application principal - WindowsFormsApplicationBase.UnhandledException. Cet événement a un objet arguments d'événement avec le même nom que l'objet arguments d'événement utilisé par AppDomain.UnhandledException, mais avec des propriétés différentes. En particulier, cet objet Event arguments possède une propriété ExitApplication qui permet à l'application de continuer à s'exécuter, en ignorant l'exception non gérée (et en laissant l'application dans un état inconnu). Dans ce cas, le domaine d'application.L'événement UnhandledException n'est pas déclenché.

Application.ThreadException peut être interceptée 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 un bon solution).

Pour détecter les exceptions qui se produisent dans les threads Non créés et appartenant à Windows Forms, utilisez AppDomain.UnhandledException. Il permet à l'application de consigner des informations sur l'exception avant que le gestionnaire par défaut du système ne signale l'exception à l'utilisateur et ne termine l'application.
la gestion de cette exception n'empêche pas la fin de l'application.
le maximum qui pourrait être fait(les données du programme peuvent être corrompues lorsque les exceptions ne sont pas gérées) enregistre les données du programme pour une récupération ultérieure. Après que le domaine d'application est déchargé et l'application se termine.

En commençant par . net 4, cet événement n'est pas déclenché pour les exceptions qui corrompent l'état du processus, telles que les débordements de pile ou les violations d'accès, sauf si le gestionnaire d'événements est critique pour la sécurité et possède l'attribut HandleProcessCorruptedStateExceptionsAttribute.

Pour plus de détails, voir MSDN.

33
répondu serhio 2014-01-07 11:36:34

OK-je l'avais devant moi, ce bit de code de msdn est assez explicite:

public static void Main(string[] args)
{
    // Add the event handler for handling UI thread exceptions to the event.
    Application.ThreadException += new 
        ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException);

    // Set the unhandled exception mode to force all Windows Forms 
    // errors to go through our handler.
    Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);

    // Add the event handler for handling non-UI thread exceptions to the event. 
    AppDomain.CurrentDomain.UnhandledException +=
        new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

    // Runs the application.
    Application.Run(new ErrorHandlerForm());
}
18
répondu JohnIdol 2010-05-18 21:04:32

Eh bien, la chose est, ThreadException se produit en raison d'un problème avec votre thread, le Unhandled Exception est déclenché si vous codez une exception qui n'est pas gérée.

Plus faciles à causer la seconde est de créer une application sans essayer...attrapez les blocs et lancez une exception.

Maintenant, si vous avez besoin d'assurance, vous pouvez les gérer tous les deux, mais si vous capturez et gérez votre exceptions correctement, vous ne devriez pas avoir besoin du gestionnaire UnhandledException car c'est un peu comme un catch all.

0
répondu Joshua Cauble 2014-04-25 06:15:45