2010-07-09 7 views
13

Ist das ein Fehler in Winforms? (Getestet auf beide VS2008 und VS2010)Warum kann das Laden von Formularen keine Ausnahme machen?

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

Ich erhalte keine Fehler in diesem Code, vor einer Weile, ich versuche, eine Lösung für diese Frage Parse a number from a string with non-digits in between

zu formulieren und ich diesen Code 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());   
} 

Ich frage mich, warum es nicht die Nummer zeigte. Dann auf den Code button1_Click bewegen ...

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

... dann bemerkte ich, dass es ein Fehler: Eingabezeichenfolge war nicht in einem korrekten Format.

Warum Form1_Load keine Ausnahme abfangen, warum es im Hintergrund fehlschlagen? Der Code wird nur aus form1_load um ausgegeben String t = s.ToCharArray(). TakeWhile ...

+1

Ich habe dieses Verhalten auf meinem Win7 SP1 x64-Entwicklungscomputer erfolgreich korrigiert. Siehe [diese Antwort] (http://stackoverflow.com/a/11997142/119527) für wie. –

Antwort

21

Rewrite, ich habe seitdem herausgefunden, woher es kommt. Windows tritt fehl, wenn eine Ausnahme in einem 32-Bit-Prozess ausgelöst wird, wenn es auf einer 64-Bit-Version von Windows 7 ausgeführt wird. Es schluckt jede Ausnahme, die von Code ausgelöst wird, der als Reaktion auf eine Windows-Meldung vom 64-Bit-Windows-Manager ausgeführt wird . Wie WM_SHOWWINDOW die Nachricht, die das Load-Ereignis ausgelöst hat.

Der Debugger spielt eine Rolle, da die normale Ausnahmeüberfüllung in einer Winforms-Anwendung deaktiviert ist, damit der Debugger bei einer Ausnahme anhalten kann. In diesem Szenario tritt das nicht auf, da Windows 7 die Ausnahme zuerst verschluckt, sodass der Debugger sie nicht sehen kann.

Ich habe über dieses Problem ausführlicher in this answer, zusammen mit möglichen Problemumgehungen geschrieben.

+0

scheint ein Bug. Während innerhalb von VS es stumm schlägt, wird keine Ausnahme gefunden. Wenn es unabhängig ausgeführt wird, kann es die Ausnahme abfangen – Hao

-1

Die WinForms-Framework-Klassen werden keine Ausnahmen automatisch für Sie abfangen. Das ist kein Fehler, es ist von Entwurf - was würden sie mit Ausnahme machen?

Sie müssen in jedem Fall Ihren eigenen Versuchs-/Catch-Block haben oder alternativ das Ereignis Application.ThreadException behandeln. Dieses Ereignis kann hilfreich sein für generischen Code, wie das Protokollieren der Exception oder das Anzeigen eines Fehlerdialogs, aber natürlich kann es nichts speziell für einen einzelnen Event oder Exception-Typ machen.

+0

versuchen, meinen Code oben auszuführen. kontrastiere das Verhalten von ** neue Exception werfen ("Hey Yo!") ** in Form1_Load und wenn es in button1_Click ist – Hao

5

Siehe auch: The case of the disappearing OnLoad exception. Es ist By-Design (obwohl durch-extrem-dumm-Design, IMO). Ihre Ausnahme trifft beim Abwickeln des Stapels auf eine Kernelmodusgrenze. Wenn Sie können, wechseln Sie zu einem anderen Ereignis oder lassen Sie keine Ausnahmen entkommen. Das hilft nicht, wenn Sie erwarten, dass Ihr Debugger in OnLoad automatisch eine nicht behandelte Ausnahme unterbricht.

Wenn Sie sich interessieren, schrieb ich ein bisschen mehr in this answer.

Verwandte Themen