簡體   English   中英

如何在Flask上捕獲這樣的異常?

[英]How to catch an Exception like this on Flask?

我運行這樣一個簡單的燒瓶應用程序:

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抓住它,我怎么能用try except

我最近在嘗試使用Flask來提供音頻文件時遇到了此錯誤消息。 每當客戶端在流結束之前關閉流時,我都會收到此錯誤消息。

此錯誤消息不是來自Flask應用程序,而是來自用於分派請求數據的基礎SocketServer。 發生的事情是由於某種原因,與客戶端的連接正在結束,但Flask繼續嘗試將數據寫入已關閉的套接字。 您無法從Flask應用程序中捕獲此異常,因為Flask會為您捕獲它。 Flask將其作為一項服務打印出來,通知您流已過早關閉,即在Flask完成向數據流寫入數據之前。

總而言之,此錯誤消息是Flask的內部信息,Flask正在打印它,告訴您在連接關閉之前無法將所有數據傳遞給客戶端。 你無法抓住它,你沒有任何理由去捕捉它。

我發現這個解決方案至少可以暫時修復。

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

您可以添加自己的退出邏輯,或者使用CTRL + \\保留程序,發送SIGQUIT。 (如果你正在運行帶螺紋的燒瓶,這很重要)

但是你不能:

   except KeyboardInterupt:

因為Flask已經捕獲了KeyboardInterupt異常並處理它們。

錯誤10052表示您正在使用Windows,因此據我所知,關閉命令窗口以退出程序

這可能是由於使用的端口號是54481,通過查看您的錯誤消息。 它可能與其他東西發生沖突。 我還建議不要使用use_reloader參數,因為你的DEBUG已經設置為False。 因此,燒瓶不會重新加載任何代碼更改。 你可以這樣做:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM