Catch块不捕捉异常,为什么

本文关键字:异常 为什么 Catch | 更新日期: 2023-09-27 18:28:13

我正在编写一个类似流氓的控制台程序,但我有一个问题:

我的代码没有捕捉到异常。我有一个带有for循环和arraysvoid。当数组超出范围时会发生错误。发生这种情况是因为void不会检查数组是在零以下还是在最大值以上。

    void lightUp(int pos)
    {
        //first and second
        for (int i = 1; i > -2; i--)
        {
            int lolPos = pos + (i * columns);
            for (int j = 0; j < 8; j++)
            {
                tiles[lolPos + j].isVisible = true;
                tiles[lolPos - j].isVisible = true;
            }
        }
        //third
        for (int i = 2; i > -3; i -= 4)
        {
            int lolPos = pos + (i * columns);
            for (int j = 0; j < 7; j++)
            {
                tiles[lolPos + j].isVisible = true;
                tiles[lolPos - j].isVisible = true;
            }
        }
        //fourth
        for (int i = 3; i > -4; i -= 6)
        {
            int lolPos = pos + (i * columns);
            for (int j = 0; j < 6; j++)
            {
                tiles[lolPos + j].isVisible = true;
                tiles[lolPos - j].isVisible = true;
            }
        }
        //fifth
        for (int i = 4; i > -5; i -= 8)
        {
            int lolPos = pos + (i * columns);
            for (int j = 0; j < 5; j++)
            {
                tiles[lolPos + j].isVisible = true;
                tiles[lolPos - j].isVisible = true;
            }
        }
        for (int i = 5; i > -6; i -= 10)
        {
            int lolPos = pos + (i * columns);
            for (int j = 0; j < 3; j++)
            {
                tiles[lolPos + j].isVisible = true;
                tiles[lolPos - j].isVisible = true;
            }
        }
    }

所以我做了一个catch块,以防发生错误,我的程序不会崩溃。

            try
            {
                lightUp(player);
            }
            catch { }

但是,我仍然得到IndexOutOfRange例外。它们不会被catch块捕获。为什么?

编辑:谢谢你的回答。认为,问题不在于调试模式选项。我发现这种情况只有在程序启动时才会发生我测试过,如果我只是走到"射程外"(空位会照亮玩家附近的瓷砖),接球挡块确实有效。但当我开始我的程序时就不会了。(玩家的位置是随机的,如果它靠近左屏幕的一侧,则异常发生在启动时。)

另一个版本:我修复了"幻数"(不低于零,也不超过最大值),无论发生什么,这都会一直有效。

Catch块不捕捉异常,为什么

你想试试这个吗:

  public void lightUp(int pos)
{
    int loopcounter = -2;
    int jcount = 8;
    int stepcount=1;
    int stepcountReflected=0;
    try
    {
        for (int x = 1; x > -6; x--)
            {
                if (x == 1)
                {
                    stepcountReflected=0.5*stepcount;
                }
                else
                {
                    stepcountReflected = stepcount;
                }
                for (int i = stepcount; i > loopcounter; i =- (2 * stepcountReflected))
                {
                    int lolPos = pos + (i * columns);
                    for (int j = 0; j < jcount; j++)
                    {
                        tiles[lolPos + j].isVisible = true;
                        tiles[lolPos - j].isVisible = true;
                    }
                }
                loopcounter = loopcounter - 1;
                jcount = jcount - 1;
            }
    }
    catch (Exception ex)
    {
        // do what yo need to do here
    }

}

目前,您正试图捕获子/函数之外的异常,这就是为什么您没有得到可靠的错误描述。当你把没有特定的"异常"而不是非常专门的"StackOverflowException"放在那里时,你会发现什么和哪里让你头疼。添加逐行活动的记录日志可能也会对您有所帮助,但这远远超出了您的问题范围,我会这么做。

检查VS中是否没有在检查异常时中断的选项(键盘快捷键:ctrl+d, e):

http://truncatedcodr.wordpress.com/2011/04/04/visual-studiodebugexceptions/

"公共语言运行时异常"一行与此相关。

除了异常问题,我还能看到两件事:

  1. 该方法中的代码太多。这将很难测试,如果失败,很难弄清楚原因——这就是你现在看到的。

  2. 这段代码看起来像c/p,但有一些更正,所以你最好抽象一下。这样以后更容易更改,代码也更少。减少代码几乎总是好的。

您面临的问题是,您必须指定要捕获的错误,并进行必要的错误处理。通常不捕获所有异常(exception类),因为这会使调试更加困难。这是邪恶的!