Hasta ahora, acabo de poner un bloque try / catch alrededor del Application.Run
en el Program.cs
punto de entrada al programa. Esto detecta todas las excepciones lo suficientemente bien en el modo de depuración, pero cuando ejecuto el programa sin el modo de depuración, las excepciones ya no se manejan. Recibo el cuadro de excepción no manejado.
No quiero que pase esto. Quiero que se detecten todas las excepciones cuando se ejecuta en modo sin depuración. El programa tiene varios subprocesos y, preferiblemente, todas las excepciones de ellos quedan atrapadas por el mismo controlador; Quiero registrar excepciones en la base de datos. ¿Alguien tiene algún consejo sobre cómo hacer esto?
fuente
En NET 4, ciertas excepciones ya no se detectan de forma predeterminada; tienden a ser excepciones que indican un estado corrupto (posiblemente fatal) del ejecutable, como una AccessViolationException.
Intente usar la etiqueta [HandleProcessCorruptedStateExceptions] delante de su método principal, por ejemplo
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; }
fuente
AppDomain.CurrentDomain.UnhandledException
yApplication.ThreadException
también con[HandleProcessCorruptedStateExceptions]
etiqueta?Puede encontrar un buen ejemplo en http://www.csharp-examples.net/catching-unhandled-exceptions/ Básicamente, cambie su main 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"); }
fuente
Puede usar la biblioteca NBug para eso. Con una configuración mínima como esta:
NBug.Settings.Destination1 = "Type=Mail;[email protected];[email protected];SmtpServer=smtp.mycompany.com;"; AppDomain.CurrentDomain.UnhandledException += NBug.Handler.UnhandledException; Application.ThreadException += NBug.Handler.ThreadException;
Puede comenzar a recopilar información sobre todos los errores no controlados en su aplicación, incluso cuando se implementa en los clientes. Si no desea utilizar una biblioteca de terceros, debe adjuntar a los siguientes eventos:
// These two should come before enabling visual styles or running the application AppDomain.CurrentDomain.UnhandledException += ... Application.ThreadException += ... ... Application.Run(new Form1());
fuente
Check Online for a Solution
OClose the Program
... etc. Pero si NO me suscribo, obtengo la excepción genérica normal no controlada de .NET Ventana. Esto sucede tanto en las versiones de lanzamiento como en las de depuración, también intenté configurarApplication.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException);
No cambia nada.