111 votes

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

Bon, c'est facile:

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

  • Dois-je gérer les deux?

Merci!

104voto

Hans Passant Points 475940

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 l'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.

38voto

serhio Points 9649

Dans les applications qui utilisent Windows Forms, les exceptions non gérées dans le thread principal de l'application de provoquer l' 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, l' UnhandledException événement n'est pas déclenché. Ce comportement peut être modifié en utilisant le fichier de configuration d'application, ou à l'aide de l' Application.SetUnhandledExceptionMode méthode pour changer le mode d' UnhandledExceptionMode.ThrowException avant l' ThreadException gestionnaire d'événement est accroché. Cela s'applique uniquement dans le thread principal de l'application. L' UnhandledException événement est déclenché pour les exceptions non gérées jetés dans d'autres threads.

Départ avec Visual Studio 2005, 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 un ExitApplication de la 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 peut être pris et l' application peut 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 l' 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 met fin à l'application.
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 la .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 l' HandleProcessCorruptedStateExceptionsAttribute d'attribut.

Pour plus de détails, consultez MSDN.

20voto

JohnIdol Points 16355

OK - je l'avais sous les yeux, ce bout 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());
}
 

0voto

Joshua Cauble Points 1302

Eh bien, la chose est, ThreadException se produit en raison d'un problème avec votre fils, l' Unhandled 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 l' UnhandledException gestionnaire comme c'est un peu comme un fourre-tout.

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