2010-07-09 18 views
13

¿Es esto un error en Winforms? (Probado en VS2008 y VS2010 tanto)¿Por qué la carga del formulario no puede detectar excepciones?

private void Form1_Load(object sender, EventArgs e) 
{ 
    throw new Exception("Hey");    
} 

no recibo ningún error en el código, hace un tiempo, que estoy tratando de formular una solución para esta cuestión Parse a number from a string with non-digits in between

Y tengo este código en Form1_Load:

private void Form1_Load(object sender, EventArgs e) 
{ 
    MessageBox.Show("X"); 
    string s = "12ACD"; 
    string t = s.ToCharArray().TakeWhile(c => char.IsDigit(c)).ToArray().ToString(); 
    MessageBox.Show("Y"); 
    int n = int.Parse(t); 
    MessageBox.Show(n.ToString());   
} 

Me pregunto por qué no mostró el número. Luego de mover el código a Button1_Click ...

private void button1_Click(object sender, EventArgs e) 
{ 
    MessageBox.Show("X"); 
    string s = "12ACD"; 
    string t = s.ToCharArray().TakeWhile(c => char.IsDigit(c)).ToArray().ToString(); 
    MessageBox.Show("Y"); 
    int n = int.Parse(t); 
    MessageBox.Show(n.ToString());   
} 

... entonces me di cuenta de que hay un error: cadena de entrada no tiene el formato correcto.

¿Por qué Form1_Load no captó ninguna excepción, por qué falla silenciosamente? El código acaba de salir de form1_load en cadena t = s.ToCharArray(). TakeWhile ...

+1

He corregido satisfactoriamente este comportamiento en mi máquina de desarrollo Win7 SP1 x64. Ver [esta respuesta] (http://stackoverflow.com/a/11997142/119527) para saber cómo. –

Respuesta

21

Reescribo, desde entonces he descubierto de dónde viene. Windows se comporta mal cuando se produce una excepción en un proceso de 32 bits cuando se ejecuta en una versión de Windows 7 de 64 bits. Se traga cualquier excepción provocada por código que se ejecuta en respuesta a un mensaje de Windows desencadenado por el administrador de Windows de 64 bits . Al igual que WM_SHOWWINDOW, el mensaje que hace que se levante el evento Load.

El depurador desempeña un papel porque cuando está activo, el reventado de excepción normal en una aplicación de Winforms se desactiva para permitir que el depurador se detenga en una excepción. Eso no sucede en este escenario porque Windows 7 se traga la excepción primero, lo que impide que el depurador la vea.

He escrito sobre este problema más extensamente en this answer, junto con posibles soluciones.

+0

parece un error. mientras que dentro de VS falla silenciosamente, no capta ninguna excepción. si se ejecuta de forma independiente, es capaz de atrapar la excepción – Hao

-1

Las clases de marco de WinForms no detectarán automáticamente ninguna excepción para usted. Eso no es un error, es por diseño. ¿Qué harían con la excepción?

Tiene que tener su propio bloque try/catch en cualquier caso o, alternativamente, manejar el evento Application.ThreadException. Ese evento puede ser útil para algunos códigos de manejo genéricos como registrar la excepción o mostrar un cuadro de diálogo de error, pero obviamente no puede hacer nada específico para un evento individual o tipo de excepción.

+0

intente ejecutar mi código anterior. contrasta el comportamiento de ** throw new Exception ("¡Hey Yo!") ** en Form1_Load y cuando está en button1_Click – Hao

5

Ver esto: The case of the disappearing OnLoad exception. Es por diseño (aunque extremadamente extremadamente estúpido, IMO). Su excepción es golpear un límite de modo kernel durante el desenrollado de la pila. Si puede, cambie a otro evento o no permita que escapen las excepciones; esto no ayuda si espera que su depurador se rompa automáticamente en una excepción no controlada en OnLoad.

Si te importa, escribí un poco más in this answer.

Cuestiones relacionadas