¿Cómo puedo hacer algo que atrape todas las excepciones ‘no controladas’ en una aplicación WinForms?

Hasta ahora, simplemente pongo un bloque try / catch alrededor de la Application.Run Program.cs en el punto de entrada Program.cs al progtwig. Esto captura todas las excepciones lo suficientemente bien en el modo de depuración, pero cuando ejecuto el progtwig sin el modo de depuración, las excepciones ya no se manejan. Obtengo el cuadro de excepción no controlada.

No quiero que esto suceda. Quiero capturar todas las excepciones cuando se ejecuta en modo no depuración. El progtwig tiene múltiples hilos y, preferiblemente, todas las excepciones de ellos quedan atrapados por el mismo controlador; Quiero registrar excepciones en el DB. ¿Alguien tiene algún consejo sobre cómo hacer esto?

Eche un vistazo al ejemplo de la documentación de 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); } 

También es posible que no desee detectar excepciones al depurar, ya que esto facilita la depuración. Es algo así como un truco, pero para eso puedes envolver el código anterior con

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

Para evitar la captura de las excepciones al depurar.

En NET 4, ciertas excepciones ya no se detectan por defecto; estos tienden a ser excepciones que indican un estado corrompido (posiblemente fatal) del ejecutable, como AccessViolationException.

Intente usar la etiqueta [HandleProcessCorruptedStateExceptions] delante de su método principal, por ej.

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

Puede usar la biblioteca de NBug para eso. Con una configuración mínima como esta:

 NBug.Settings.Destination1 = "Type=Mail;From=me@mycompany.com;To=bugtracker@mycompany.com;SmtpServer=smtp.mycompany.com;"; AppDomain.CurrentDomain.UnhandledException += NBug.Handler.UnhandledException; Application.ThreadException += NBug.Handler.ThreadException; 

Puede comenzar a recostackr información sobre todos los errores no administrados en su aplicación, incluso cuando se implementa en los clientes. Si no desea utilizar una biblioteca de terceros, debe adjuntar a los eventos a continuación:

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

Un buen ejemplo se puede encontrar en http://www.csharp-examples.net/catching-unhandled-exceptions/ Básicamente, cambie su principal a:

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