Jusqu'à présent, je viens de mettre un bloc try / catch autour du Application.Run
dans le Program.cs
point d'entrée du programme. Cela intercepte assez bien toutes les exceptions en mode débogage, mais lorsque j'exécute le programme sans le mode débogage, les exceptions ne sont plus gérées. J'obtiens la boîte d'exception non gérée.
Je ne veux pas que ça arrive. Je veux que toutes les exceptions soient interceptées lors de l'exécution en mode non-débogage. Le programme a plusieurs threads et de préférence toutes les exceptions de ceux-ci sont interceptées par le même gestionnaire; Je souhaite enregistrer les exceptions dans la base de données. Quelqu'un at-il des conseils sur la façon de procéder?
la source
Dans NET 4, certaines exceptions ne sont plus interceptées par défaut; il s'agit généralement d'exceptions qui indiquent un état corrompu (éventuellement fatal) de l'exécutable, comme une AccessViolationException.
Essayez d'utiliser la balise [HandleProcessCorruptedStateExceptions] devant votre méthode principale, par exemple
using System.Runtime.ExceptionServices.HandleProcessCorruptedStateExceptions [HandleProcessCorruptedStateExceptions] public static int Main() { try { // Catch any exceptions leaking out of the program CallMainProgramLoop(); } catch (Exception e) // We could be catching anything here { System.Console.WriteLine(e.Message); return 1; } return 0; }
la source
AppDomain.CurrentDomain.UnhandledException
etApplication.ThreadException
aussi avec[HandleProcessCorruptedStateExceptions]
tag?Un bel exemple peut être trouvé à http://www.csharp-examples.net/catching-unhandled-exceptions/ En gros, changez votre main en:
static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException); Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); Application.Run(new Form1()); } static void Application_ThreadException(object sender, ThreadExceptionEventArgs e) { MessageBox.Show(e.Exception.Message, "Unhandled Thread Exception"); } static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { MessageBox.Show((e.ExceptionObject as Exception).Message, "Unhandled UI Exception"); }
la source
Vous pouvez utiliser la bibliothèque NBug pour cela. Avec une configuration minimale comme celle-ci:
NBug.Settings.Destination1 = "Type=Mail;[email protected];[email protected];SmtpServer=smtp.mycompany.com;"; AppDomain.CurrentDomain.UnhandledException += NBug.Handler.UnhandledException; Application.ThreadException += NBug.Handler.ThreadException;
Vous pouvez commencer à collecter des informations sur tous les bogues non gérés dans votre application, même lorsqu'elle est déployée sur les clients. Si vous ne souhaitez pas utiliser une bibliothèque tierce, vous devez vous attacher aux événements ci-dessous:
// These two should come before enabling visual styles or running the application AppDomain.CurrentDomain.UnhandledException += ... Application.ThreadException += ... ... Application.Run(new Form1());
la source
Check Online for a Solution
OuClose the Program
.. etc. Mais si je ne m'abonne PAS, j'obtiens l'exception générique standard. La fenêtre. Cela se produit sur les versions Release et Debug, également essayé de définirApplication.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
Ne change rien.