gpt4 book ai didi

python - 捕获 Bottle 服务器错误

转载 作者:太空狗 更新时间:2023-10-30 02:32:34 25 4
gpt4 key购买 nike

我正在尝试获取我的 Bottle 服务器,以便当游戏中的一个人注销时,每个人都可以立即看到它。由于我使用的是长轮询,因此所有用户都打开了一个请求。

我遇到的问题是捕获当用户从无法再连接到页面的长轮询离开页面时抛出的异常。错误信息在这里。

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) 装饰器,但也没有触发。这似乎与 Bottle 的内部结构有关。

编辑:我现在知道我需要捕捉 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

关于python - 捕获 Bottle 服务器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17508415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com