繁体   English   中英

捕获瓶服务器错误

[英]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亚军

仔细观察一下追溯:这不是在您的函数中发生,而是在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运行器的工作方式是:

  1. 收到请求
  2. 从您的代码中获得部分响应
  3. 发送给客户端(这是引发异常的地方)
  4. 重复步骤2-3

您无法捕获此异常

您的代码中不会引发此错误。

当您尝试向关闭连接的客户端发送响应时,就会发生这种情况。

因此,您将无法从代码中捕获此错误。

替代解决方案

不幸的是,无法从生成器(您的代码)中得知何时停止使用它。

依靠生成器进行垃圾回收也不是一个好主意。

您还有其他一些解决方案。

“最后一次露面”

知道用户何时断开连接的另一种方法可能是在yield语句之后记录“最后一次看到”。

如果最近一次断开连接的客户端已经过去,您将能够确定它们已断开连接。

其他亚军

另一个非WSGI运行器将更适合于实时应用程序。 您可以尝试tornado

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM