Catch块不捕捉异常,为什么
本文关键字:异常 为什么 Catch | 更新日期: 2023-09-27 18:28:13
我正在编写一个类似流氓的控制台程序,但我有一个问题:
我的代码没有捕捉到异常。我有一个带有for
循环和arrays
的void
。当数组超出范围时会发生错误。发生这种情况是因为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
块捕获。为什么?
编辑:谢谢你的回答。认为,问题不在于调试模式选项。我发现这种情况只有在程序启动时才会发生我测试过,如果我只是走到"射程外"(空位会照亮玩家附近的瓷砖),接球挡块确实有效。但当我开始我的程序时就不会了。(玩家的位置是随机的,如果它靠近左屏幕的一侧,则异常发生在启动时。)
另一个版本:我修复了"幻数"(不低于零,也不超过最大值),无论发生什么,这都会一直有效。
你想试试这个吗:
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/
"公共语言运行时异常"一行与此相关。
除了异常问题,我还能看到两件事:
-
该方法中的代码太多。这将很难测试,如果失败,很难弄清楚原因——这就是你现在看到的。
-
这段代码看起来像c/p,但有一些更正,所以你最好抽象一下。这样以后更容易更改,代码也更少。减少代码几乎总是好的。
您面临的问题是,您必须指定要捕获的错误,并进行必要的错误处理。通常不捕获所有异常(exception类),因为这会使调试更加困难。这是邪恶的!