[英]Catching bottle server errors
我正在嘗試獲取我的瓶子服務器,以便游戲中的一個人注銷時,每個人都可以立即看到它。 當我使用長時間輪詢時,所有用戶都會打開一個請求。
我遇到的麻煩是從長時間無法再連接到頁面的輪詢中捕獲用戶離開頁面時引發的異常。 錯誤消息在這里。
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,但是我不知道代碼中的下落
仔細觀察一下追溯:這不是在您的函數中發生,而是在WSGI運行程序中發生。
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/gevent/pywsgi.py", line 438, in handle_one_response
self.run_application()
在您的情況下,WSGI運行器的工作方式是:
您的代碼中不會引發此錯誤。
當您嘗試向關閉連接的客戶端發送響應時,就會發生這種情況。
因此,您將無法從代碼中捕獲此錯誤。
不幸的是,無法從生成器(您的代碼)中得知何時停止使用它。
依靠生成器進行垃圾回收也不是一個好主意。
您還有其他一些解決方案。
知道用戶何時斷開連接的另一種方法可能是在yield
語句之后記錄“最后一次看到”。
如果最近一次斷開連接的客戶端已經過去,您將能夠確定它們已斷開連接。
另一個非WSGI運行器將更適合於實時應用程序。 您可以嘗試tornado
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.