0

imagesfor ループの繰り返しごとに、(空として初期化された)リストにオブジェクトを追加しています。私は明示的にインデックスでリストにアクセスしているのではなく、単にオブジェクトを追加しているだけですIndexError: list index out of range

スタック トレースは次のとおりです。

  Traceback (most recent call last):
   File "/mnt/www-data/run/backend/lib/python2.7/site-packages/flask/app.py", line 1504, in wsgi_app
     response = self.full_dispatch_request()
   File "/mnt/www-data/run/backend/lib/python2.7/site-packages/flask/app.py", line 1264, in full_dispatch_request
     rv = self.handle_user_exception(e)
   File "/mnt/www-data/run/backend/lib/python2.7/site-packages/flask/app.py", line 1262, in full_dispatch_request
     rv = self.dispatch_request()
   File "/mnt/www-data/run/backend/lib/python2.7/site-packages/flask/app.py", line 1248, in dispatch_request
     return self.view_functions[rule.endpoint](**req.view_args)
   File "/mnt/www-data/run/backend/lib/python2.7/site-packages/newrelic-1.4.0.137-py2.7-linux-x86_64.egg/newrelic/api/object_wrapper.py", line 166, in __call__
     self._nr_instance, args, kwargs)
   File "/mnt/www-data/run/backend/lib/python2.7/site-packages/newrelic-1.4.0.137-py2.7-linux-x86_64.egg/newrelic/api/function_trace.py", line 81, in literal_wrapper
     return wrapped(*args, **kwargs)
   File "/mnt/www-data/run/backend/lib/python2.7/site-packages/newrelic-1.4.0.137-py2.7-linux-x86_64.egg/newrelic/api/name_transaction.py", line 58, in __call__
     return self._nr_next_object(*args, **kwargs)
   File "/mnt/www-data/run/backend/webservice/decorators/controller_wrapper.py", line 75, in decorated_function
     return _return(f(*args, body=body, **kwargs))
   File "/mnt/www-data/run/backend/webservice/decorators/controller_wrapper.py", line 90, in decorated_function
     r = f(*args, **kwargs)
   File "/mnt/www-data/run/backend/webservice/decorators/login_required.py", line 16, in decorated_function
     return f(*args, **kwargs)
   File "/mnt/www-data/run/backend/webservice/controllers/me/photos.py", line 28, in create_photo
     phs = photos.store_photos(g.user, data)
   File "/mnt/www-data/run/backend/evertale/tasks/photos.py", line 106, in store_photos
     images.append(entity)
  IndexError: list index out of range

.../tasks/photos.py の抜粋です。失敗した行は for ループの最後です。

def store_photos(user, photos, update=False):
    if type(photos) is dict:
        photos = [photos]

    images = []
    for pic in photos:
        if 'gps' in pic and pic['gps']:
            loc = Location(ts=long(pic['ts']), user=user, _latlon=pic['gps'])
            loc.save()
        image = None
        if 'data' in pic:
            image = _read_image_from_base64(pic['data'])
            image = _normalize_rotation(image)
        entity = _persist_entity(user, image, update, **pic)
        if image:
            file_name = _file_name(entity.id)
            _persist_file(image, file_name)
            thumb_photo(entity.id)
        images.append(entity)

    if len(images) > 1:
        return images
    elif len(images) == 1:
        return images[0]
    else:
        return []

なぜこれが起こるのか誰にも分かりますか?コードが運用サーバー上にあるため、これをデバッグすることはできません。また、ローカル マシンでテストするときにこのようなことを経験したことはありません。

4

2 に答える 2

3

サーバーのソースコードは、サーバーを開始してから変更されたようです。実際、私はそれをほぼ確信しています。

Python バイトコードには行番号が含まれており、トレースバックが発生すると、この行番号を使用して、コンパイルされていないソース行を検索して表示します。

ただし、バイトコードがメモリに読み込まれると、ソース ファイルを変更しても再読み込みされません。サーバーの起動後にソース ファイルに行を追加または削除すると、トレースバックの行が正しくなくなります。

つまり、トレースバックに表示される行は、ほぼ確実にエラーが発生した行ではありません。.append()私は確かに、単純にその例外をスローすること期待していません。特定の例外 ( ) は、 (操作)list index out of rangeを通じてリスト内の特定のエントリを検索しようとしたときにのみ発生します。__getattr__lst[index]

于 2012-09-07T16:39:00.737 に答える
2

Martijn の言うことは正しいかもしれませんが、別の外部の可能性があります。

.append()が C でコーディングされる前に呼び出された最後の関数(_persist_entity()またはthumb_photo())、またはそれらのいずれかが最後に C でコーディングされたものを呼び出した場合、C コードがエラーを適切にチェックおよび処理できなかった場合、次のような状態になる可能性があります。例外がスローされましたが、認識されませんでした。その場合、追加呼び出しは、例外がスローされていなくても、例外がスローされたことを認識している可能性があります。

于 2012-09-07T16:45:08.590 に答える