Catch块没有捕获异常,为什么?

时间:2013-08-17 18:01:11

标签: c# .net

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

我的代码没有捕获异常。我有voidfor个循环和arrays。 阵列超出范围时发生错误。发生这种情况是因为虚空不会检查数组是否为零或超过最大值。

    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块困住。 那是为什么?

编辑: 感谢所有的答案。以为,问题不在于调试模式选项。 我发现这只会在程序启动时发生我测试过,如果我只是走到&#34;超出范围&#34; (虚空点亮了玩家附近的瓷砖),捕获块确实有效。但不是在我启动程序的时候。(播放器的位置是随机的,如果它靠近左侧屏幕的一侧,则会在启动时发生异常。)

另一个编辑:我修复了#34;魔法数字&#34;(不低于零,不超过最大值), 无论发生什么事情,这都会有效。

3 个答案:

答案 0 :(得分: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”时,你会看到什么和哪里让你头疼。 添加逐行活动的记录日志可能对您有所帮助,但这不是您的问题,而是我会做的。

答案 1 :(得分:0)

检入VS是否在选中的例外情况下没有中断选项(键盘快捷键:ctrl+d, e):

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

“Common Language Runtime Exceptions”行与此相关。

答案 2 :(得分:-1)

我可以看到除了异常问题之外的两件事:

  1. 该方法中的代码太多了。它很难测试,如果失败,很难弄清楚为什么 - 这就是你现在所看到的。

  2. 代码看起来像c / p,有一些修正,所以你应该更好地抽象这样做。这将使以后更容易更改,并减少代码。更少的代码几乎总是好的。

  3. 您面临的问题是您必须指定要捕获的错误,并执行必要的错误处理。习惯上不捕获所有异常(异常类),因为这将使调试更加困难。这是邪恶的!