Я пытаюсь поймать исключение при использовании объекта Response.Мой пример использования заключается в том, что я хочу передавать данные, как описано в официальной документации , и существует вероятность исключения, когда я получаю данные для потоковой передачи:
# test.py
from flask import Flask, Response, jsonify
import werkzeug
app = Flask(__name__)
@app.route("/")
def hello():
def generate():
raise Exception
for i in range(0,10):
yield '1'
try:
return Response(generate())
except Exception:
return jsonify("error") # expected this but instead 500 server error is returned
if __name__ == '__main__':
app.run()
Когда я запускаю сервер и запрашиваю данные, я ожидаю увидеть «ошибку», но вместо этого отображается сообщение Внутренняя ошибка сервера от Flask.
FLASK_APP=test.py flask run
curl http://localhost:5000/
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>500 Internal Server Error</title>
<h1>Internal Server Error</h1>
<p>The server encountered an internal error and was unable to
complete your request. Either the server is overloaded or there is
an error in the application.</p>
В некотором смысле возникает исключение, какмы можем видеть это в stdout, но Flask не ловит их.Я также попытался убедиться, что исключение не перехватывается, установив параметр passthrough_errors сервера werkzeug.Тогда исключение не перехватывается в Werkzeug, например, здесь или здесь .К сожалению, это не помогло перехватить его в приложении Flask, указанном выше:
app.run(passthrough_errors=True)
Вывод колбы - версия:
Flask 1.0.2
Python 3.7.0 (default, Aug 22 2018, 15:22:33)
[Clang 9.1.0 (clang-902.0.39.2)]
ОБНОВЛЕНИЕ: Эта проблема такжепроисходит, когда я не использую потоковую передачу:
from flask import Flask, Response, jsonify
app = Flask(__name__)
@app.route("/")
def hello():
try:
return Response(2)
except Exception as error:
return jsonify({'error': error})
if __name__ == '__main__':
app.run(passthrough_errors=False)
Ошибка TypeError возникает на стороне Flask, потому что Integer не повторяется, но исключение не перехватывается.
FLASK_APP=test.py flask run
curl http://localhost:5000/
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>500 Internal Server Error</title>
<h1>Internal Server Error</h1>
<p>The server encountered an internal error and was unable to
complete your request. Either the server is overloaded or there is
an error in the application.</p>