2010-11-16 3 views

Répondre

5

Vous pouvez écouter les événements Application.ThreadException et AppDomain.UnhandledException pour intercepter des exceptions non interceptées à partir du thread. Mais le mieux est d'attraper et de gérer les exceptions dans les threads eux-mêmes. Cela devrait être un dernier recours pour la fermeture/journalisation gracieuse.

2

Cela dépend du framework .NET que vous ciblez.

Dans 1.1 et moins, les exceptions lancées par les threads enfants ne seront transmises au thread principal que si elles s'exécutent en dehors d'un bloc try/catch.

Dans 2.0 et versions ultérieures, ce comportement est modifié: le thread sera terminé et les exceptions ne pourront plus continuer. De toute façon, vous pouvez gérer les exceptions dans un thread comme vous le feriez dans une application monothread.

Voir http://msdn.microsoft.com/en-us/library/ms228965(v=VS.90).aspx pour référence.

+1

Les exceptions lancées par les threads enfants vont tuer tout le programme en commençant par .NET 2. – cdhowie

+0

vient d'être essayé. cdhowie est correct. – user496949

+0

Que voulez-vous dire par "transmis au thread principal"? Pouvez-vous donner un exemple de comment cela fonctionnerait et comment ces exceptions pourraient être attrapées? –

0

Non, considérez le code suivant:

try 
{ 
    var t = new Thread(()=> 
     { 
      Thread.Sleep(5000); 
      throw new Exception(); 
     }); 
    t.Start(); 
    //t.Join(); 
} 
catch 
{ 
    //you can't deal with exception here 
    //even though you uncomment `t.Join` 
} 

Traiter avec des exceptions dans le fil de l'enfant que les exceptions "appartient" à.