超出数组范围的值

时间:2012-01-22 16:38:11

标签: c# arrays exception-handling

我正在迭代数组,有时我必须检查超出边界的值。当然它会引发异常,但我不想在它之后完全停止应用程序,只是跳过这个代码元素。

这样安全且不会导致内存泄漏吗?

try
{
    if (arrayName[i - 1, j].DoSomething())
         something++;
}
catch
{ // empty for purpose
}

4 个答案:

答案 0 :(得分:6)

使用if语句等更好的做法,而不是吞咽异常。

您可以在此处查看有关该主题的进一步讨论: Why are empty catch blocks a bad idea?

答案 1 :(得分:2)

我会检查以确保数组中的位置有效

if (arrayName[i - 1, j] != null) 
{
  arrayName[i - 1, j].DoSomething();
}

或使用try / catch,但记录它,所以它不会永远丢失。

try
{
    if (arrayName[i - 1, j].DoSomething())
         something++;
}
catch(Exception e)
{ 
    _log.Error(e.Message);
}

无论如何,您概述的方法虽然不是最佳实践,但不会导致内存泄漏

答案 2 :(得分:1)

只需检查索引是否在范围内。 GetLength返回指定维度的长度:

if (i - 1 < arrayName.GetLength(0) && j < arrayName.GetLength(1))
{
    if (arrayName[i - 1, j].DoSomething())
        something++;
}

答案 3 :(得分:1)

只要您没有在try块中分配资源,导致它们不被释放(通常通过Dispose,它就不会导致内存泄漏方法)。如果是这种情况,请考虑使用using块来保证资源被释放。

有些不清楚你要做什么,但似乎你正在尝试使用异常作为一种机制来避免明确检查你的数组索引是否有效。这通常是一件坏事,因为异常应该用于异常情况,如果输入是合理的并且没有合理的方法来阻止它,那么你不会发生这种情况。如果您提供更多上下文,我们可能会建议更好的方法。

另外,正如 kfugslang 所说,你应该几乎总是避免使用空的和不合格的catch块,因为这些会捕获{strong> {}中发生的任何异常{1}}阻止,而不仅仅是你期望抛出的那个。例如,堆栈中的某些内部方法可能会抛出一个与您自己的代码无关的完全无关的异常,它只会被吞噬。你不是明智的,但结果是不可预测的,而且很可能是不正确的。

相反,您应该只尝试将限定的 try语句用于特定的异常类型。