2015-11-03 63 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几次,并检查调用堆栈以查看里面的哪个语句导致了这种情况的发生。

为什么会出现这种情况还有另外一个原因,我最好用一整杯水来描述它。如果你有一杯水已经满了(但还没有溢出),并且你把一滴额外的水滴放入玻璃杯中,然后它溢出来了,是一滴水滴故障还是全部十亿滴水滴之前它被放入玻璃杯中?

有可能是完全不同的东西导致堆栈溢出发生,只是发生这种方法是最后一滴溢出堆栈。

尝试断点,看看你有多远。