Quel élément .config affecte le traitement des exceptions avec UnhandledExceptionMode défini sur UnhandledExceptionMode.Automatic?

J’ai une application Windows Forms qui a ce code au démarrage du programme:

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.Automatic); 

Dans la documentation MSDN pour UnhandledExceptionMode.Automatic, il est indiqué que:

Automatique – Route toutes les exceptions vers le gestionnaire ThreadException, sauf indication contraire du fichier de configuration de l’application.

Est-ce que quelqu’un sait exactement quel élément / atsortingbut dans le fichier de configuration affecte ce paramètre?

Vous pouvez append une section JitDebugging à votre fichier de configuration comme ceci:

    

Cela équivaut à définir UnhandledExceptionMode sur UnhandledExceptionMode.ThrowException (d’ailleurs, si vous exécutez votre application avec un débogueur attaché, cette option est automatiquement activée).

Notez que UnhandledExceptionMode.Automatic est la valeur par défaut utilisée par .Net, sauf indication contraire de votre part; pour autant que je sache, la seule raison de définir explicitement le mode d’exception non gérée sur automatique est si vous souhaitez annuler un appel précédent qui l’a modifié. Notez que si vous le définissez sur autre chose que Automatique, le paramètre du fichier de configuration ne sera pas lu.

Notez que si vous associez une exception ThreadException à la classe AppDomain actuelle, le résultat est automatiquement identique à UnhandledExceptionMode.CatchException que vous aviez défini pour UnhandledExceptionMode sur UnhandledExceptionMode.CatchException .

Je me suis aussi posé des questions à ce sujet et je n’ai jamais rien trouvé à propos d’une option de configuration intégrée que vous puissiez définir (il peut y en avoir une, mais je n’ai jamais trouvé de mention de ce qu’elle était). Je pense que nous avons également constaté que le comportement par défaut (si vous ne faites rien de tout cela) est équivalent au mode ThrowException, contrairement à ce que MSDN implique dans cette citation. De plus, je pense que le régler sur Automatique équivaut à ne pas le toucher du tout. c’est déjà en automatique pour commencer.

Cependant, j’ai découvert qu’il y a deux surcharges de SetUnhandledExceptionMode . Le mode normal fonctionne par thread (généralement, vous ne disposez que d’un thread), mais le second prend également un booléen qui détermine si le paramètre est appliqué uniquement au thread actuel (true) ou à tous les threads de l’interface utilisateur. (faux). Passer des actions fausses revient à définir un paramètre par défaut pour les futures unités d’interface utilisateur si elles sont laissées définies en mode Automatic à leur démarrage (par quoi je veux dire des boucles de messages, c.-à-d. Des appels à Application.Run ), et vous pouvez y accrocher votre propre option de configuration. cet appel pour définir votre valeur globale par défaut. Je me demande si c’est ce qu’ils voulaient vraiment faire avec la vague référence à “config”.

L’avertissement est cependant que l’appel SetUnhandledExceptionMode doit être effectué avant de créer un SetUnhandledExceptionMode de fenêtre dans le même contexte. Il faut donc l’appeler avec false avant de créer un handle de fenêtre sur un thread. De plus, le débogueur Visual Studio crée apparemment un handle de fenêtre avant le démarrage de votre code. Cet appel ne peut donc jamais aboutir (avec false) lors du débogage. Toutefois, ce handle de fenêtre ne se trouvant pas sur votre thread, l’appel normal (ou avec true) peut donc être effectué en toute sécurité dans un scénario de débogage. Je ne sais pas comment cela se comporte dans les autres cas où l’application WinForms se trouve dans un sous-domaine créé plutôt que dans le domaine initial / supérieur, qu’un sous-domaine hérite de l’indicateur any-handle-created ou commence à nouveau. C’est peut-être le problème réel dans le cas de Visual Studio.

L’appel normal (ou avec true) doit toujours être effectué avant de créer un handle de fenêtre sur ce thread. Je crois que ce paramètre persistera jusqu’à la sortie du contexte d’application si vous entrez à nouveau dans Application.Run sur le même thread (de même que l’indicateur créé par le descripteur qui interrompt d’autres appels pour le modifier). Sachez toutefois que la souscription à Application.ThreadException fait par thread et par contexte et sera perdue lors de la fermeture de Application.Run . De plus, il ne peut avoir qu’un seul abonné (écrase tout abonné précédent) et ne peut pas être modifié pendant l’exécution de la boucle de messages. Ainsi, si vous appelez à nouveau Application.Run , vous devez vous réabonner à Application.ThreadException avant d’appeler Application.Run . Sinon, ils seront interceptés et envoyés au gestionnaire WinForms par défaut (je ne veux pas dire UnhandledException) car le paramètre “mode exception” persiste. Normalement, vous ne continuez pas à entrer et à sortir d’une boucle de message sur le même fil. Ce n’est donc pas un problème, mais nous l’avons rencontré parce que nous devions le faire dans Gibraltar.Agent .

AppDomain.UnhandledException , cependant, est un événement normal avec plusieurs abonnés et n’est pas spécifique à un thread. Abonnez-vous une fois et vous êtes couvert pour l’ensemble de l’AppDomain (par exemple, CurrentDomain).

Peut-être que ceci est la réponse à votre question? Gestion des “exceptions non gérées” dans .NET 2.0