簡體   English   中英

如何使用gevent捕獲異常?

[英]How to catch an exception with gevent?

我有運行下列服務器gevent之上flask

import gevent.monkey
gevent.monkey.patch_all()
import flask
import gevent.wsgi

app = flask.Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

gevent.wsgi.WSGIServer(('127.0.0.1', 5000), app, keyfile='my.key', certfile='my.cer').serve_forever()

調用https://127.0.0.1:5000時運行良好,但崩潰時顯示為http://127.0.0.1:5000 原因是在HTTPS上下文中未正確處理HTTP調用:

Traceback (most recent call last):
  File "C:\Users\aaa\AppData\Local\Programs\Python\Python35-32\lib\site-packages\gevent\greenlet.py", line 536, in run
    result = self._run(*self.args, **self.kwargs)
  File "C:\Users\aaa\AppData\Local\Programs\Python\Python35-32\lib\site-packages\gevent\baseserver.py", line 26, in _handle_and_close_when_done
    return handle(*args_tuple)
  File "C:\Users\aaa\AppData\Local\Programs\Python\Python35-32\lib\site-packages\gevent\server.py", line 173, in wrap_socket_and_handle
    ssl_socket = self.wrap_socket(client_socket, **self.ssl_args)
  File "C:\Users\aaa\AppData\Local\Programs\Python\Python35-32\lib\site-packages\gevent\_ssl3.py", line 646, in wrap_socket
    ciphers=ciphers)
  File "C:\Users\aaa\AppData\Local\Programs\Python\Python35-32\lib\site-packages\gevent\_ssl3.py", line 229, in __init__
    raise x
  File "C:\Users\aaa\AppData\Local\Programs\Python\Python35-32\lib\site-packages\gevent\_ssl3.py", line 225, in __init__
    self.do_handshake()
  File "C:\Users\aaa\AppData\Local\Programs\Python\Python35-32\lib\site-packages\gevent\_ssl3.py", line 549, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [SSL: HTTP_REQUEST] http request (_ssl.c:645)
Mon Sep  4 16:19:01 2017 <Greenlet at 0x4631c60: _handle_and_close_when_done(<bound method StreamServer.wrap_socket_and_handle , <bound method StreamServer.do_close of <WSGIServer, (<gevent._socket3.socket [closed]  object, fd=-1, )> failed with SSLError

捕獲此類循環( .serve_forever() )中引發的異常的正確方法是什么?

我天真地嘗試過

try:
    gevent.wsgi.WSGIServer(('127.0.0.1', 5000), app, keyfile='my.key', certfile='my.cer').serve_forever()
except Exception as e:
    print("got exception {e}".format(e=e))

但它沒有被捕獲(我的揮手印象是try / except對在運行serve_forever()循環時尚未就位(並且永遠不會))

您可以生成一個greenlet並為其附加異常處理程序:

g = gevent.spawn(WSGIServer(...).serve_forever)
def exception_callback(g):
    """Process gevent exception"""
    try:
        g.get()
    except Exception as exc:
        pass

g.link_exception(exception_callback)

暫無
暫無

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

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