Значение вне границ массива - PullRequest
0 голосов
/ 22 января 2012

Я перебираю массив, и иногда мне приходится проверять значения, которые выходят за границы.Конечно, это вызывает исключение, но я не хочу полностью останавливать приложение после него, просто пропустите этот элемент кода.

Является ли что-то подобное безопасным и не вызовет утечек памяти?

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

Ответы [ 4 ]

6 голосов
/ 22 января 2012

Лучше использовать выражение if и т. П., А не глотать исключения.

Дальнейшее обсуждение по теме можно посмотреть здесь: Почему пустой catch блокирует плохоидея?

2 голосов
/ 22 января 2012

я бы проверил, чтобы убедиться, что позиция в массиве действительна

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);
}

независимо, описанный вами подход, хотя и не лучший, не вызовет утечек памяти

1 голос
/ 22 января 2012

Это не приведет к утечкам памяти, если вы не выделяете ресурсы в блоке try таким образом, что исключение не приводит к их освобождению (обычно с помощью метода Dispose). В этом случае рассмотрите возможность использования блока using, чтобы гарантировать высвобождение ресурсов.

Несколько неясно, что вы пытаетесь сделать, но похоже, что вы пытаетесь использовать исключения как механизм, позволяющий избежать явной проверки правильности индексов вашего массива. Это (обычно) плохо, так как исключения должны использоваться для исключительных обстоятельств, которых вы не ожидаете, если ввод является разумным и для которого нет разумного способа предотвратить его. Если вы предоставите немного больше контекста, мы сможем предложить лучший способ сделать это.

Кроме того, как говорит kfugslang , вы почти всегда должны избегать использования пустых и неквалифицированных блоков catch, так как они будут ловить любое исключение , которое происходит в блоке try, не только тот, которого вы ожидаете бросить. Например, некоторые внутренние методы, расположенные ниже по стеку, могут выдавать совершенно не связанное исключение, которое не имеет ничего общего с вашим собственным кодом, и его просто проглотят. Вы бы не стали мудрее, но результаты были бы непредсказуемы и, скорее всего, неверны.

Вместо этого вы должны использовать только квалифицированных catch операторов для определенных типов исключений.

1 голос
/ 22 января 2012

Просто убедитесь, что индексы находятся в диапазоне.GetLength возвращает длину указанного измерения:

if (i - 1 < arrayName.GetLength(0) && j < arrayName.GetLength(1))
{
    if (arrayName[i - 1, j].DoSomething())
        something++;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...