4

ゲーム内の 1 人がログアウトすると、全員がすぐにそれを見ることができるように、ボトル サーバーを取得しようとしています。ロング ポーリングを使用しているため、すべてのユーザーに対してリクエストが開かれています。

私が問題を抱えているビットは、ユーザーがページに接続できなくなった長いポーリングからページを離れたときにスローされる例外をキャッチすることです。エラーメッセージはこちら。

Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/gevent/pywsgi.py", line 438, in handle_one_response
    self.run_application()
  File "/usr/lib/python2.7/dist-packages/gevent/pywsgi.py", line 425, in run_application
    self.process_result()
  File "/usr/lib/python2.7/dist-packages/gevent/pywsgi.py", line 416, in process_result
    self.write(data)
  File "/usr/lib/python2.7/dist-packages/gevent/pywsgi.py", line 373, in write
    self.socket.sendall(msg)
  File "/usr/lib/python2.7/dist-packages/gevent/socket.py", line 509, in sendall
    data_sent += self.send(_get_memory(data, data_sent), flags)
  File "/usr/lib/python2.7/dist-packages/gevent/socket.py", line 483, in send
    return sock.send(data, flags)
error: [Errno 32] Broken pipe
<WSGIServer fileno=3 address=0.0.0.0:8080>: Failed to handle request:
  request = GET /refreshlobby/1 HTTP/1.1 from ('127.0.0.1', 53331)
  application = <bottle.Bottle object at 0x7f9c05672750>

127.0.0.1 - - [2013-07-07 10:59:30] "GET /refreshlobby/1 HTTP/1.1" 200 160 6.038377

そのページを扱う関数がこれです。

@route('/refreshlobby/<id>')
def refreshlobby(id):
    while True:
        yield lobby.refresh()
        gevent.sleep(1)

関数内と @route をラップするデコレーターで例外をキャッチしようとしましたが、どちらも機能しませんでした。@error(500) デコレータを作ってみましたが、それもトリガーしませんでした。これはボトルの中身が関係しているようです。

編集:socket.errorをキャッチする必要があることはわかっていますが、コードのどこにあるのかわかりません

4

1 に答える 1