Il y a quelques options ici. Si vous n'êtes pas concernés par ce que j'appelle ETW (fin du monde) exceptions comme StackOverflowException (? Que diriez-vous que), vous pouvez envelopper le tout dans un bloc try-catch-finally dans votre point d'entrée:
static void Main()
{
try
{
// Run...
}
catch (Exception ex)
{
// Log failure.
}
finally
{
// Log shutdown.
}
}
Si vous utilisez du filetage du tout, les choses deviennent beaucoup plus désordonnées. L'utilisation correcte des délégués et du modèle Begin/End Invoke propage les exceptions sur le thread en cours (lorsque la méthode EndInvoke est appelée). L'utilisation de la classe Thread rendra les choses plus compliquées. Je peux sans risque supposer qu'il y a un moyen de faire face à cela (mais personnellement, je n'utilise pas souvent des threads propres). J'ai lu sur les tubes que pour une raison quelconque une exception ETW dans votre AppDomain est fatale pour l'ensemble AppDomain (même si cela ne devrait pas être si cela ne se produit pas sur votre thread principal); ne comptez pas sur les threads si vous voulez les éviter. En ce qui concerne les exceptions ETW, votre meilleur pari est d'isoler le code potentiellement buggé dans un autre AppDomain (hors ou en cours) et d'y accéder via Remoting. Remoting vous protégera de ces exceptions. L'accès à distance vous protégera également des terminaisons inattendues de l'application cible. Rien ne vous évitera d'éteindre le poste de travail à moins que vous ne puissiez le nettoyer dans un laps de temps limité (Windows tentera d'abord de fermer votre application de manière déterministe). J'ai expérimenté avec CER, mais je n'ai rien inventé. Vous voudrez peut-être regarder l'article MSDN this.
ouais. c'est ce que je pense aussi. – Jack