无法处理StackOverflowException C#

时间:2015-11-03 15:01:34

标签: c# .net exception exception-handling stack-overflow

我不知道为什么我无法处理由该代码引起的此异常:

    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 个答案:

答案 0 :(得分:6)

您无法处理堆栈溢出异常,因为为了记录异常信息,代码必须执行的操作之一是调用某些代码。

由于你已经溢出了堆栈,所以绝对不能做的事情就是调用更多的代码。

因此,Windows只会终止程序。

因此StackOverflowException是无法捕获的,除非您在实际堆栈实际溢出之前自己明确地抛出它。

现在,这回答了你问的问题。

这里真正的问题是所显示的代码实际上并不调用自身,但方法_SelectedIndexChanged的名称意味着该代码中的某些内容使checkedListBox1再次调用此方法。 / p>

可能不应该。

你应该在这个方法中放置一个断点并按F5几次并检查调用堆栈,看看里面的哪个语句导致这种情况发生。

还有另一个原因可能会发生这种情况,我可以通过提到一整杯水来最好地描述它。如果你有一杯已经装满的水(但还没有溢出),你又将一滴水倒入玻璃杯中,然后它会溢出,是一个单一的水滴出现故障,还是其他十亿滴水都掉了在它之前放入玻璃杯?

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

尝试断点,看看你能走多远。