Question: Je souhaite définir un gestionnaire d'exceptions global pour les exceptions non gérées dans mon application console. Dans asp.net, on peut en définir un dans global.asax, et dans les applications / services Windows, on peut définir comme ci-dessous
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyExceptionHandler);
Mais comment puis-je définir un gestionnaire d'exceptions global pour une application console?
currentDomain ne semble pas fonctionner (.NET 2.0)?
Éditer:
Argh, stupide erreur.
Dans VB.NET, il faut ajouter le mot clé "AddHandler" devant currentDomain, sinon on ne voit pas l'événement UnhandledException dans IntelliSense ...
C'est parce que les compilateurs VB.NET et C # traitent la gestion des événements différemment.
la source
Console.ReadLine()
ou toute autre perturbation du déroulement du programme. Mais ce que j'obtiens est l'exception de sur-relancer encore et encore, et encore.Si vous avez une application à un seul thread, vous pouvez utiliser un simple try / catch dans la fonction Main, cependant, cela ne couvre pas les exceptions qui peuvent être levées en dehors de la fonction Main, sur d'autres threads, par exemple (comme indiqué dans d'autres commentaires). Ce code montre comment une exception peut entraîner la fermeture de l'application même si vous avez essayé de la gérer dans Main (notez comment le programme se termine correctement si vous appuyez sur Entrée et autorisez l'application à se fermer correctement avant que l'exception ne se produise, mais si vous la laissez s'exécuter) , il se termine malheureusement):
Vous pouvez recevoir une notification lorsqu'un autre thread lève une exception pour effectuer un nettoyage avant la fermeture de l'application, mais pour autant que je sache, vous ne pouvez pas, à partir d'une application console, forcer l'application à continuer de fonctionner si vous ne gérez pas l'exception sur le thread à partir duquel elle est lancée sans utiliser certaines options de compatibilité obscures pour que l'application se comporte comme elle l'aurait fait avec .NET 1.x. Ce code montre comment le thread principal peut être notifié des exceptions provenant d'autres threads, mais se terminera toujours malheureusement:
Donc, à mon avis, la façon la plus propre de le gérer dans une application console est de s'assurer que chaque thread a un gestionnaire d'exceptions au niveau racine:
la source
Vous devez également gérer les exceptions des threads:
Oups, désolé pour Winforms, pour tous les threads que vous utilisez dans une application console, vous devrez les placer dans un bloc try / catch. Les threads d'arrière-plan qui rencontrent des exceptions non gérées ne provoquent pas la fin de l'application.
la source
Je viens d'hériter d'une ancienne application de console VB.NET et j'avais besoin de configurer un gestionnaire d'exceptions global. Étant donné que cette question mentionne VB.NET à quelques reprises et est étiquetée avec VB.NET, mais toutes les autres réponses ici sont en C #, j'ai pensé que j'ajouterais également la syntaxe exacte pour une application VB.NET.
J'ai utilisé le
REM
marqueur de commentaire au lieu de la citation simple ici parce que Stack Overflow semblait gérer la syntaxe en soulignant un peu mieux avecREM
.la source
Ce que vous essayez devrait fonctionner selon les documents MSDN pour .Net 2.0. Vous pouvez également essayer un try / catch en main autour de votre point d'entrée pour l'application console.
Et maintenant, votre capture gérera tout ce qui n'est pas capturé ( dans le fil principal ). Il peut être gracieux et même redémarrer là où il était si vous le souhaitez, ou vous pouvez simplement laisser l'application mourir et enregistrer l'exception. Vous ajouterez enfin un si vous vouliez faire un nettoyage. Chaque thread nécessitera sa propre gestion des exceptions de haut niveau similaire à la principale.
Modifié pour clarifier le point sur les threads comme souligné par BlueMonkMN et montré en détail dans sa réponse.
la source