Que se passe-t-il lorsqu’un thread .NET lève une exception?

Nous avons une interface IPoller pour laquelle nous avons différentes implémentations. Nous avons un processus qui prend un IPoller et le démarre dans un thread séparé. J’essaie de trouver un moyen générique de fournir une gestion des exceptions à tous les utilisateurs qui ne le font pas eux-mêmes.

Ma pensée initiale était de créer une implémentation d’IPoller qui accepterait un IPoller et ne fournirait qu’une fonctionnalité de journalisation. La question que j’ai cependant posée est de savoir comment puis-je fournir ce traitement des erreurs? Si j’ai IPoller.Start (), la cible du thread est celle où l’exception se produira? Ou y a-t-il quelque chose sur le fil que je peux accrocher?

Quelque chose comme:

Thread thread = new Thread(delegate() { try { MyIPoller.Start(); } catch(ThreadAbortException) { } catch(Exception ex) { //handle } finally { } }); 

Cela garantira que l’exception ne parviendra pas au sumt du fil.

Vous devriez intercepter l’exception avec la méthode que vous utilisez en haut du thread et effectuer la journalisation à partir de là.

Une exception non gérée (au sumt d’un thread) va (à partir de 2.0) tuer votre processus. Pas bon.

quelle que soit la méthode que vous passez à Thread.Start (etc) devrait avoir un try / catch , et faire quelque chose d’utile dans l’ catch (journalisation, éventuellement arrêt gracieux, etc.)

Pour ce faire, vous pouvez utiliser:

  • méthodes de journalisation statique
  • variables capturées dans le délégué (en tant que méthode anonyme)
  • exposer votre méthode sur une instance qui connaît déjà l’enregistreur

Dans .NET 4.0+, vous devez utiliser des tâches plutôt que des threads. Voici un bel article sur la gestion des exceptions dans Task Parallel Library

Jetez un coup d’œil à AppDomain.UnhandledException , cela vous aidera au moins à vous connecter aux exceptions que vous ne gérez pas et, dans certains cas, à fermer “joliment”:

Cet événement fournit une notification des exceptions non capturées. Il permet à l’application de consigner des informations sur l’exception avant que le gestionnaire de système par défaut ne le signale à l’utilisateur et termine l’application. Si suffisamment d’informations sur l’état de l’application sont disponibles, d’autres actions peuvent être entresockets, telles que la sauvegarde des données du programme pour une récupération ultérieure. La prudence est recommandée, car les données du programme peuvent être corrompues lorsque les exceptions ne sont pas gérées.

Jettes un coup d’oeil à

Événement Appdomain.FirstChanceException

Il vous indique à quel moment une exception se produit et CLR recherche une trace de stack. Les arguments d’événement indiquent également le type d’exception. Vous pouvez le considérer comme le lieu central pour la journalisation.