Захват ошибки 500 серверов в Flask
Мне нравится ловить флэшку. Это красиво просто:
@app.errorhandler(404)
def pageNotFound(error):
return "page not found"
работает как шарм. Но это не работает для кода ошибки 500. Я хочу поймать ошибки Python, когда что-то пойдет не так, в коде возникает повышенное исключение. Возможно ли это?
Я должен заметить, что если я явно вызываю return abort(500)
в представлении, тогда работает обработчик ошибок 500. Так что это явно, когда сбой кода Python.
Возможно ли это?
Ответы
Ответ 1
То, что вы описали, по умолчанию, как работает Flask. Мое предположение заключается в том, что вы работаете в режиме отладки, и поэтому на экране отладки отображаются исключения. Убедитесь, что режим отладки выключен, затем повторите попытку. Вот комментарий непосредственно из самого кода:
Обработка исключений по умолчанию, которая срабатывает, когда возникает исключение, не пойман. В режиме отладки исключение будет повторно поднято в противном случае он регистрируется и обработчик для 500 внутренних сервер используется. Если такой обработчик не существует, значение по умолчанию 500 выводится сообщение об ошибке внутреннего сервера.
Ответ 2
Он отлично работает на моей стороне:
from flask import Flask ,url_for,render_template,request,abort
from werkzeug.debug import get_current_traceback
app = Flask(__name__)
@app.route('/')
def index():
try:
raise Exception("Can't connect to database")
except Exception,e:
track= get_current_traceback(skip=1, show_hidden_frames=True,
ignore_system_exceptions=False)
track.log()
abort(500)
return "index"
@app.errorhandler(500)
def internal_error(error):
return "500 error"
@app.errorhandler(404)
def not_found(error):
return "404 error",404
if __name__== "__main__":
app.run(debug=True)
Flask не будет устанавливать код ошибки для вас, поэтому при возврате ответа обязательно укажите код состояния HTTP.
Ответ 3
вот мой код snippt
@app.route('/')
def index():
raise Exception("Can't connect to database")
@app.errorhandler(Exception)
def exception_handler(error):
return "!!!!" + repr(error)
Ответ 4
Моим решением было включить распространение исключений, изменив словарь конфигурации:
app = Flask(__name__)
...
app.config['PROPAGATE_EXCEPTIONS'] = True
Посмотрите на этот другой родственный вопрос: Приложение Flask вызывает ошибку 500 без исключения
Ответ 5
этот код перехватывает 500 кодов состояния и получает ошибку исключения
@app.errorhandler(Exception)
def all_exception_handler(e):
error = str(traceback.format_exc())