如何在Flask上捕获这样的异常?

时间:2013-07-22 11:59:14

标签: python flask try-catch

我运行这样一个简单的烧瓶应用程序:

from flask import Flask

app = Flask(__name__) 

@app.route('/')
def welcome():
    return "OK"


app.config.update(
    DEBUG = True
)

if __name__ == '__main__':
    app.run(use_reloader = False)

当我运行它并访问它时,有时(并非总是)它无法响应请求并抛出一个除外:

Exception happened during processing of request from ('127.0.0.1', 54481)
Traceback (most recent call last):
  File "c:\python27\Lib\SocketServer.py", line 295, in _handle_request_noblock
    self.process_request(request, client_address)
  File "c:\python27\Lib\SocketServer.py", line 321, in process_request
    self.finish_request(request, client_address)
  File "c:\python27\Lib\SocketServer.py", line 334, in finish_request
    self.RequestHandlerClass(request, client_address, self)
  File "c:\python27\Lib\SocketServer.py", line 651, in __init__
    self.finish()
  File "c:\python27\Lib\SocketServer.py", line 710, in finish
    self.wfile.close()
  File "c:\python27\Lib\socket.py", line 279, in close
    self.flush()
  File "c:\python27\Lib\socket.py", line 303, in flush
    self._sock.sendall(view[write_offset:write_offset+buffer_size])
error: [Errno 10053]

我无法理解是什么导致了这个错误?我该如何解决呢?

我如何使用try except来抓住它?

3 个答案:

答案 0 :(得分:11)

我最近在尝试使用Flask提供音频文件时遇到了此错误消息。每当客户端在流结束之前关闭流时,我都会收到此错误消息。

此错误消息不是来自Flask应用程序,而是来自用于分派请求数据的基础SocketServer。发生的事情是由于某种原因,与客户端的连接正在结束,但Flask继续尝试将数据写入已关闭的套接字。您无法从Flask应用程序中捕获此异常,因为Flask会为您捕获它。 Flask将其作为一项服务打印出来,通知您该流过早关闭,即在Flask完成向数据流写入数据之前。

总而言之,此错误消息是Flask的内部信息,Flask正在打印它,告诉您在连接关闭之前无法将所有数据传输到客户端。你无法抓住它,你没有任何理由去捕捉它。

答案 1 :(得分:0)

我发现这个解决方案至少可以暂时解决。

if __name__ == '__main__':
  while True:
    try:
       app.run(use_reloader = False)
    except:
      pass

您可以添加自己的退出逻辑,或者使用CTRL + \保留程序,发送SIGQUIT。 (如果你正在使用带螺纹的烧瓶,这很重要)

但你不能:

   except KeyboardInterupt:

因为Flask已经捕获了KeyboardInterupt异常并处理它们。

错误10052表示您正在使用Windows,据我所知,关闭命令窗口以退出程序

答案 2 :(得分:-3)

可能是由于使用的端口号是54481,通过查看您的错误消息。它可能与其他东西发生冲突。我还建议不要使用use_reloader参数,因为你的DEBUG已经设置为False。因此,烧瓶不会重新加载任何代码更改。你可以这样做:

if __name__ == '__main__':
    app.run(port=5000)