[英]Why the form load can't catch exception?
這是Winforms中的錯誤嗎? (在VS2008和VS2010上測試)
private void Form1_Load(object sender, EventArgs e)
{
throw new Exception("Hey");
}
我沒有在那段代碼中收到任何錯誤,前一段時間,我正在嘗試為這個問題制定解決方案從一個字符串中解析一個數字,其中包含非數字
我在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());
}
我想知道為什么它沒有顯示數字。 然后將代碼移動到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());
}
...然后我注意到有一個錯誤: 輸入字符串的格式不正確。
為什么Form1_Load沒有捕獲任何異常,為什么它會默默地失敗? 代碼剛剛退出form1_load at string t = s.ToCharArray()。TakeWhile ...
重寫,我已經弄清楚它來自哪里。 Windows在64位版本的Windows 7上運行時,如果在32位進程中引發異常,則會出現異常。它會吞下由響應由64位Windows管理器觸發的Windows消息而運行的代碼引發的任何異常。 與WM_SHOWWINDOW一樣,導致Load事件被引發的消息。
調試器起作用,因為當它處於活動狀態時,Winforms應用程序中的正常異常捕獲被關閉以允許調試器停止異常。 在這種情況下不會發生這種情況,因為Windows 7首先吞下異常,阻止調試器看到它。
我在這個答案中更廣泛地寫了這個問題,以及可能的解決方法。
請參閱: OnLoad異常消失的情況 。 它是按設計進行的(盡管極其愚蠢的設計,IMO)。 您的異常是在展開堆棧期間遇到內核模式邊界。 如果可以,切換到其他一些事件,或者不要讓異常逃脫; 如果你期望你的調試器在OnLoad上自動中斷未處理的異常,這沒有用。
如果你關心,我在這個答案中寫了更多。
WinForms框架類不會自動捕獲任何異常。 這不是一個錯誤,它是設計 - 他們會做什么與例外?
您必須在任何事件中擁有自己的try / catch塊,或者處理Application.ThreadException
事件。 該事件對於某些通用處理代碼(如記錄異常或顯示錯誤對話框)很有幫助,但顯然它不能對任何單個事件或異常類型執行任何特定操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.