-4

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

我的代码没有捕获异常。我有一个voidwithfor循环和arrays. 当数组超出范围时会发生错误。发生这种情况是因为 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 块确实有效。但不是在我启动程序时。(播放器的位置是随机的,如果它靠近左侧屏幕的一侧,则在启动时会发生异常。)

另一个编辑:我修复了“神奇数字”(不低于零,也不超过最大值),无论发生什么,它都会一直有效。

4

3 回答 3

1

你想试试这个:

  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”时,您会看到什么和在哪里让您头疼。逐行添加记录的活动日志也可能对您有所帮助,但这超出了您的问题范围,这正是我会做的。

于 2014-03-20T13:56:33.383 回答
0

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

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

“公共语言运行时异常”行与此处相关。

于 2013-08-17T18:53:49.253 回答
-1

除了异常问题,我可以看到两件事:

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

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

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

于 2013-08-17T18:08:19.300 回答