Обойти повышение IndexError - PullRequest
8 голосов
/ 02 марта 2011

Мой код выглядит следующим образом:

for p in qs:
    set = None
    try:
        set = p.property.property_locations.all()
    except IndexError:
        pass

    if set:

Проблема состоит в том, что, когда set не равен никому, он по-прежнему выдает IndexError из этой части django.db.models.query:

try:
    qs = self._clone()
    qs.query.set_limits(k, k + 1)
    return list(qs)[0] 
except self.model.DoesNotExist, e:
    raise IndexError(e.args)

Как не дать системе выдать эту ошибку и перейти к следующему элементу цикла for?

1 Ответ

14 голосов
/ 19 марта 2011

В любом случае в вашем коде есть две ошибки:

  1. set - это встроенная функция (как вы можете видеть из подсветки синтаксиса SO), поэтому, присваивая своей переменной имя, вы скрываете встроенную функцию без всякой цели, что, по крайней мере, является плохой практикой и может вызвать проблемы в дальнейшем. код.
  2. Канонический способ проверить, не установлен ли None, - записать: если set не равен None

Еще лучше, канонический способ написать этот фрагмент кода:

try:
    [code that might raise an exception]
except Error:
    [code that handles the exception]
else:
    [code that executes when no exception was raised]

(замените Ошибка на фактическое исключение, конечно)

Таким образом, вам даже не нужно проверять 'set' в этой точке.

...