veces una repente que porque para mujer luego importas ignorar ignoran ignora hombre hacer habla gusto cuando como busque busca amor c# winforms exception

c# - una - ¿Cómo puedo hacer que WinForms deje de ignorar silenciosamente las excepciones no controladas?



que hacer cuando un hombre te ignora (4)

Esto se está volviendo extremadamente irritante. En este momento tengo una aplicación de winforms, y las cosas no estaban funcionando bien, pero no se lanzaron excepciones por lo que pude ver. Después de recorrer casi todos los códigos relevantes, resulta que se lanzó una excepción al inicio de mi aplicación.

Para abreviar, en WinForms, siendo tan impresionante como es, si se produce una excepción, la biblioteca de WinForms lo ignora. No se ha lanzado una "excepción no controlada", se emite el mensaje JIT, simplemente deja de procesar el evento actual y vuelve a la GUI.

Esto está causando errores al azar, porque el código para cargar datos no se está llamando debido a la excepción que se produce antes de que se carguen estos datos.

Para ver esto en acción, creé una nueva aplicación WinForms e ingresé el siguiente código:

public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { string blah = null; blah.Trim(); } }

Presione F5 y el formulario se carga sin que se muestren errores, aunque se esté lanzando una referencia nula.

Luego intenté ir al método principal de Program.cs y agregar Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException); lo. Aún así, mi formulario se carga sin causar ningún error.

Aunque sé que puedo decirle a VS que rompa todas las excepciones, encuentro esta situación realmente mala. Causa problemas realmente extraños que son difíciles de depurar en la producción, y como esta es una herramienta interna, realmente quiero tenerla, por lo que en realidad se produce un error cuando se produce una excepción y no se ignora silenciosamente.

¿Alguien sabe como hacer esto?

Actualización: Solo para actualizar las cosas que aprendí de los comentarios.

Esto parece ser un problema de 64 bits con Windows, como aprendí de esta pregunta que no vi antes de publicar. En esa pregunta, señaló un informe de error de Microsoft sobre esto, que tenía esto que decir:

Hola,

Este error se cerró como "Externo" porque este comportamiento es el resultado de cómo la versión x64 de Windows maneja las excepciones. Cuando una excepción de modo de usuario cruza una transición de kernel, las versiones x64 de Windows no permiten que la excepción se propague. Por lo tanto, los depuradores adjuntos desconocen el hecho de que se produjo una excepción que hace que el depurador no logre romper la excepción no controlada.

Desafortunadamente, donde no hay nada que el equipo de Visual Studo pueda hacer para solucionar esto, es el resultado del diseño del sistema operativo. Todos los comentarios sobre este problema deben dirigirse al equipo de Windows; sin embargo, el equipo de Windows considera que este es el diseño del sistema operativo "correcto" y considera que el comportamiento de x86 es "incorrecto".

Saludos cordiales, Visual Studio Debugger

Dicho esto, las compilaciones que no se ejecutan a través de Visual Studio (o usando Ctrl + F5 para ejecutarse) parecen mostrar el cuadro de mensaje de excepción JIT EXCEPTO si usted tiene el siguiente código en su Program.cs :

Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException);

Ese código hará que Windows ignore la excepción.

Sin embargo, si (en cambio) se suscribe al evento Application.ThreadException , no solo se capturarán sus excepciones, el depurador de visual studio se dividirá en excepciones no controladas.


En la función principal de Program.cs, también debe asegurarse de haber completado su llamada para abrir el formulario en try / catch. Además, use AppDomain.UnhandledException para detectar excepciones. También agregamos Application.ThreadException también.

Creo que lo siguiente te dará ganchos en todas las excepciones que se pueden lanzar ...

static void Main() { try { System.Windows.Forms.Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); System.Windows.Forms.Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(OnGuiUnhandedException); AppDomain.CurrentDomain.UnhandledException += OnUnhandledException; var form = new MainForm(); form.ShowDialog(); } catch (Exception e) { HandleUnhandledException(e); } finally { // Do stuff } } private static void HandleUnhandledException(Object o) { // TODO: Log it! Exception e = o as Exception; if (e != null) { } } private static void OnUnhandledException(Object sender, UnhandledExceptionEventArgs e) { HandleUnhandledException(e.ExceptionObject); } private static void OnGuiUnhandedException(object sender, System.Threading.ThreadExceptionEventArgs e) { HandleUnhandledException(e.Exception); }


Habiendo experimentado esto a menudo e identificado el problema relacionado con el sistema operativo de 64 bits y el evento Form.Load, siempre me limito a hacer todas mis funciones de inicio en el evento Form.Shown. Para todos los fines prácticos, esto es lo mismo (aparte de algunas circunstancias raras y excepcionales), y el mensaje JIT se produce en el evento Mostrado.


Prueba lo siguiente.

  • Maneje excepciones en el punto de entrada de su aplicación principal.
  • Además, gestione las excepciones de hilos no controlados utilizando un ThreadExceptionEventHandler

Este es el fragmento de código:

[STAThread] public static void Main(string[] args) { try { Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException); //your program entry point } catch (Exception ex) { //manage also these exceptions } } private void Application_ThreadException(object sender, ThreadExceptionEventArgs e) { ProcessException(e.Exception); }


Una solución fácil es no ejecutar bajo el depurador.

El depurador está enmascarando la excepción por alguna razón. Si ejecuta su aplicación normalmente (Ctrl + F5), obtendrá el habitual "Se ha producido una excepción no controlada en su aplicación ... ¿Continuar / Salir?" diálogo.