2015-11-03 92 views
0

我不知道爲什麼我不能處理這個異常是由代碼引起的:無法處理StackOverflowException C#

private void checkedListBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     try 
     { 
      for (int i = 0; i < checkedListBox1.Items.Count; i++) 
      { 
        int id = int.Parse(((DataRowView)checkedListBox1.Items[i])[0].ToString()); 
        bool check = checkedListBox1.GetItemChecked(i); 
        DataRow[] dr = dt.Select("id = " + id.ToString()); 
        dr[0][2] = check; 
      } 
     } 
     catch (StackOverflowException) { } 
    } 

Image: Unhandled StackOverflowException

+1

'StackOverflowException'是您無法捕捉的異常之一。 –

回答

5

你不能處理堆棧溢出異常,因爲一個爲了記錄關於異常的信息,代碼必須做的事情是調用一些代碼。

既然你已經溢出了堆棧,它絕對不能做的事情之一是調用更多的代碼。

因此,Windows爲什麼只是終止程序。

A StackOverflowException因此是不可捕捉的,除非您在實際堆棧實際溢出之前自己明確地拋出它。

現在,這回答你問的問題。

這裏真正的問題是,所顯示的代碼實際上並未自行調用,但方法_SelectedIndexChanged的名稱意味着該代碼中的某些內容會使checkedListBox1再次調用此方法。

它可能不應該。

你應該在這個方法中放置一個斷點,然後點擊F5幾次,並檢查調用堆棧以查看裏面的哪個語句導致了這種情況的發生。

爲什麼會出現這種情況還有另外一個原因,我最好用一整杯水來描述它。如果你有一杯水已經滿了(但還沒有溢出),並且你把一滴額外的水滴放入玻璃杯中,然後它溢出來了,是一滴水滴故障還是全部十億滴水滴之前它被放入玻璃杯中?

有可能是完全不同的東西導致堆棧溢出發生,只是發生這種方法是最後一滴溢出堆棧。

嘗試斷點,看看你有多遠。