【问题标题】:Can't handle StackOverflowException C# [duplicate]无法处理 StackOverflowException C# [重复]
【发布时间】:2015-11-03 15:01:33
【问题描述】:

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

    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

【问题讨论】:

  • StackOverflowException 是您无法捕获的异常之一。

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


【解决方案1】:

您无法处理堆栈溢出异常,因为代码为了记录有关异常的信息而必须做的一件事就是调用一些代码。

既然你已经溢出了堆栈,它绝对不能做的事情之一就是调用更多的代码。

这就是为什么 Windows 只是终止程序。

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

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

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

它可能不应该。

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

发生这种情况还有另一个原因,我可以用一整杯水来最好地描述它。如果你有一杯已经满了(但还没有溢出)的水,你在杯子里多放了一滴水,然后它溢出了,是一滴有错,还是其他十亿滴在它之前被放入玻璃杯中?

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 2012-08-04
    相关资源
    最近更新 更多