2010-07-09 32 views
13

Si tratta di un bug in Winforms? (Testato su entrambi VS2008 e VS2010)Perché il caricamento del modulo non può rilevare l'eccezione?

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

non ricevo alcun errore nel codice che, poco fa, sto cercando di formulare una soluzione per questo problema Parse a number from a string with non-digits in between

E faccio questo codice in 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());   
} 

mi chiedo perché non ha mostrato il numero. Poi sullo spostamento del codice per 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());   
} 

... poi ho notato che c'è un errore: stringa di input non era in un formato corretto.

Perché Form1_Load non ha rilevato alcuna eccezione, perché ha fallito silenziosamente? Il codice esce da form1_load all'indirizzo string t = s.ToCharArray(). TakeWhile ...

+1

Ho corretto correttamente questo comportamento sul mio computer di sviluppo x64 Win7 SP1. Vedi [questa risposta] (http://stackoverflow.com/a/11997142/119527) per come. –

risposta

21

Riscrivere, da allora ho capito da dove viene. Windows si comporta in modo anomalo quando viene sollevata un'eccezione in un processo a 32 bit quando viene eseguita su una versione a 64 bit di Windows 7. Ingoia qualsiasi eccezione generata dal codice eseguito in risposta a un messaggio di Windows attivato dal gestore di finestre a 64 bit . Come WM_SHOWWINDOW, il messaggio che causa il sollevamento dell'evento Load.

Il debugger ha un ruolo perché quando è attivo, il normale intrappolamento delle eccezioni in un'app Winforms viene disattivato per consentire al debugger di fermarsi su un'eccezione. Ciò non accade in questo scenario perché Windows 7 ingoia prima l'eccezione, impedendo al debugger di vederlo.

Ho scritto su questo problema in modo più approfondito in this answer, insieme a possibili soluzioni alternative.

+0

sembra un bug. mentre all'interno VS fallisce silenziosamente, non cattura alcuna eccezione. se eseguito in modo indipendente, è in grado di rilevare l'eccezione – Hao

-1

Le classi di framework WinForms non rilevano automaticamente eccezioni per te. Questo non è un bug, è di progettazione - cosa farebbero con l'eccezione?

È necessario disporre del proprio blocco try/catch in ogni caso o in alternativa gestire l'evento Application.ThreadException. Questo evento può essere utile per un codice di gestione generico come la registrazione dell'eccezione o la visualizzazione di una finestra di errore, ma ovviamente non può fare nulla di specifico per ogni singolo evento o tipo di eccezione.

+0

prova ad eseguire il mio codice qui sopra. contrasto il comportamento di ** lanciare una nuova eccezione ("Hey Yo!") ** in Form1_Load e quando è in button1_Click – Hao

5

Vedere questo: The case of the disappearing OnLoad exception. È di design (anche se estremamente-stupido-design, IMO). La tua eccezione sta colpendo un limite in modalità kernel durante lo svolgimento dello stack. Se puoi, passa ad un altro evento o non far scappare le eccezioni; questo non aiuta se si aspetta che il debugger si interrompa automaticamente su un'eccezione non gestita in OnLoad.

Se ti interessa, ho scritto un po 'di più in this answer.

Problemi correlati