Come posso creare qualcosa che cattura tutte le eccezioni ‘non gestite’ in un’applicazione WinForms?

Fino ad ora, ho appena inserito un blocco try / catch attorno a Application.Run nel punto di ingresso Program.cs al programma. Questo cattura tutte le eccezioni abbastanza bene in modalità Debug, ma quando eseguo il programma senza la modalità di debug, le eccezioni non vengono più gestite. Prendo la scatola delle eccezioni non gestita.

Non voglio che ciò accada. Voglio che tutte le eccezioni vengano catturate durante l’esecuzione in modalità non di debug. Il programma ha più thread e preferibilmente tutte le eccezioni da essi vengono catturate dallo stesso gestore; Voglio registrare le eccezioni nel DB. Qualcuno ha qualche consiglio su come farlo?

Dai un’occhiata all’esempio della documentazione di ThreadException :

 public static void Main(string[] args) { // Add the event handler for handling UI thread exceptions to the event. Application.ThreadException += new ThreadExceptionEventHandler(ErrorHandlerForm.Form1_UIThreadException); // Set the unhandled exception mode to force all Windows Forms errors // to go through our handler. Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); // Add the event handler for handling non-UI thread exceptions to the event. AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); } 

Potresti anche non voler rilevare eccezioni durante il debug, in quanto ciò rende più facile il debug. È un po ‘un hack, ma per quello si può avvolgere il codice sopra con

  if (!AppDomain.CurrentDomain.FriendlyName.EndsWith("vshost.exe")) { ... } 

Per evitare di rilevare le eccezioni durante il debug.

In NET 4, alcune eccezioni non vengono più rilevate per impostazione predefinita; questi tendono ad essere eccezioni che indicano uno stato corrotto (eventualmente fatale) dell’eseguibile, come ad esempio AccessViolationException.

Prova a utilizzare il tag [HandleProcessCorruptedStateExceptions] davanti al tuo metodo principale, ad es

 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; } 

Puoi usare la libreria NBug per questo. Con una configurazione minima come questa:

 NBug.Settings.Destination1 = "Type=Mail;[email protected];[email protected];SmtpServer=smtp.mycompany.com;"; AppDomain.CurrentDomain.UnhandledException += NBug.Handler.UnhandledException; Application.ThreadException += NBug.Handler.ThreadException; 

È ansible iniziare a raccogliere informazioni su tutti i bug non gestiti nella propria applicazione, anche quando è distribuito ai client. Se non si desidera utilizzare una libreria di terze parti, è necessario albind agli eventi riportati di seguito:

 // These two should come before enabling visual styles or running the application AppDomain.CurrentDomain.UnhandledException += ... Application.ThreadException += ... ... Application.Run(new Form1()); 

Un bell’esempio può essere trovato su http://www.csharp-examples.net/catching-unhandled-exceptions/ In pratica, cambia la tua principale in:

 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"); }