.NET Global gestionnaire d'exception dans l'application de la console
Question: je veux définir un gestionnaire global d'exception pour les exceptions non gérées dans mon application console. Dans asp.net on peut définir un en mondial de.asax, et dans les applications windows /services, on peut définir comme ci-dessous
AppDomain currentDomain = AppDomain.CurrentDomain;
currentDomain.UnhandledException += new UnhandledExceptionEventHandler(MyExceptionHandler);
Mais comment puis-je définir un gestionnaire global d'exception pour une application console ?
currentDomain semble ne pas fonctionner (.NET 2.0) ?
Edit:
Argh, erreur stupide.
Dans VB.NET, on doit ajouter le "AddHandler" mot-clé devant currentDomain, ou sinon, on ne voit pas le UnhandledException événement dans IntelliSense...
C'est parce que le VB.NET et C# compilateurs traiter la gestion des événements différemment.
Vous devez vous connecter pour publier un commentaire.
Non, c'est la façon correcte de le faire. Cela a fonctionné exactement comme il se doit, quelque chose que vous pouvez travailler à partir peut-être:
Ne garder à l'esprit que vous ne pouvez pas attraper le type de fichier et charger les exceptions générées par la gigue de cette façon. Ils se produisent avant que votre méthode main() commence à courir. La capture de ces exige de retarder la gigue, déplacez le risqué de code en une autre méthode et d'appliquer la [attribut methodimpl(MethodImplOptions.NoInlining)] attribuent.
Console.ReadLine()
ou toute autre perturbation du déroulement du programme. Mais ce que je reçois est l'exception-relancer encore et encore, et encore.Si vous avez un seul thread de l'application, vous pouvez utiliser un simple try/catch dans la fonction Principale, cependant, cela ne couvre pas les exceptions qui peuvent être levées en dehors de la fonction Principale, sur d'autres threads, par exemple (comme indiqué dans d'autres commentaires). Ce code montre comment une exception peut entraîner l'application de résilier même si vous avez essayé de le manipuler en Main (notez la façon dont le programme se termine normalement si vous appuyez sur entrée et de permettre l'application de fermer correctement avant de l'exception se produit, mais si vous les laissez s'exécuter, il se termine assez malheureusement):
Vous pouvez recevoir une notification lorsque un autre thread déclenche une exception pour effectuer certaines nettoyer avant de l'application se ferme, mais aussi loin que je peux dire, vous ne pouvez pas, à partir d'une application console, la force de l'application de continuer à courir, si vous ne la manipulez pas l'exception sur le fil à partir de laquelle il est jeté, sans l'aide de quelque obscur de compatibilité des options pour rendre l'application de se comporter comme il aurait avec des .NET 1.x. Ce code montre comment le thread principal peut être notifié des exceptions venant d'autres threads, mais toujours mettre fin à l'malheureusement:
Donc, à mon avis, la meilleure façon de le gérer dans une application console est de veiller à ce que chaque thread dispose d'un gestionnaire d'exception au niveau de la racine:
Vous devez également gérer les exceptions de threads:
Whoop, désolé c'était pour winforms, pour tous les threads dans une application console, vous devrez les placer dans un bloc try/catch. Threads d'arrière-plan qui rencontre les exceptions non gérées ne pas entraîner l'application à la fin.
Ce que vous essayez devrait fonctionner selon la doc MSDN pour .Net 2.0. Vous pouvez également essayer un try/catch droite dans main autour de votre point d'entrée pour l'application console.
Et maintenant votre catch gérer tout ce qui n'est pas pris (dans le thread principal). Il peut être gracieuse et même redémarrer où il a été si vous le souhaitez, ou vous pouvez simplement laisser le soft de mourir et le journal de l'exception. Vous woul ajouter un enfin, si vous vouliez faire un nettoyage. Chaque fil doit être de haut niveau, la gestion des exceptions similaires à la main.
Modifié afin de clarifier le point à propos des threads comme l'a souligné BlueMonkMN et présentés en détail dans sa réponse.