簡體   English   中英

為什么表單加載無法捕獲異常?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM