【问题标题】:How to catch an Exception like this on Flask?如何在 Flask 上捕获这样的异常?
【发布时间】:2013-07-22 11:59:13
【问题描述】:

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

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 来捕捉它?

【问题讨论】:

    标签: python flask try-catch


    【解决方案1】:

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

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

    总而言之,这个错误消息是 Flask 内部的,Flask 打印它是为了告诉你在连接关闭之前它无法将所有数据发送到客户端。你抓不到,也不应该有任何理由去抓。

    【讨论】:

    • 没错。这不是真正的烧瓶错误,而是内部Web服务器的错误,因为连接已关闭,它无法将所有数据发送到客户端。如果您在页面仍在加载时快速按重新加载或停止,则可能会发生这种情况。你不应该在生产中使用内部服务器,一切都很好。
    • 感谢您的解释。这让我发疯了。所以这不是一个错误,这些消息很烦人。 @user305883 当我点击那个链接时,我只看到一个大 404 之间的紫色幽灵。
    • @muammar odoo.com/forum/help-1/question/… 如果有用再试一次。
    • 我遇到了<video src="example.flv">。浏览器中止了它不支持的视频格式的二进制下载。我抓住它的原因是为了提供更多信息的错误消息。堆栈转储对于这个相对良性的错误来说太痛苦了。
    • @BobStein-VisiBone 上次我在 4 年前检查过,你无法抓住它。 Flask 不会把它扔给你。不过,您可以在 Flask 中解决此问题。这些天我不在 python 中编写服务器,所以我可能不会解决它。无论 Flask 在哪里尝试写入 Socket 对象,调用都应该防范此异常并在此失败时关闭/删除 Socket 对象。也许在调试或信息级别记录事件。
    【解决方案2】:

    我发现这个解决方案至少是一个很好的临时解决方案。

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

    您可以添加自己的退出逻辑,或者使用发送 SIGQUIT 的 CTRL + \ 离开程序。 (如果您正在运行线程烧瓶,这很重要)

    但是你不能:

       except KeyboardInterupt:
    

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

    error 10052表示你使用的是windows,据我所知,关闭命令窗口退出程序

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 我不认为你的回答是正确的,因为端口 54481 是请求的端口(即来自网络浏览器)。
      • 但默认烧瓶使用 5000 端口:github.com/mitsuhiko/flask/blob/master/flask/app.py#L766。在您的示例中,您的应用程序不应使用 54481 端口作为开发服务器。
      • FWIW,我遇到了同样的问题,我使用了自定义端口,我已经关闭了调试。我认为建议一个不同的端口是一个红鲱鱼。
      猜你喜欢
      • 2018-06-17
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-21
      • 2015-03-16
      相关资源
      最近更新 更多