#python #flask #exception #error-handling #hook
Вопрос:
У меня есть сервер колб.
Всякий раз, когда код внутри моего обработчика выдает исключение, Flask улавливает его и возвращает клиенту HTML-страницу с ошибкой 5XX.
Проблема в том, что я этого не замечаю. Я только что получил электронное письмо от кого-то, кто использует мой API, в котором говорится, что они получают 504 ошибки, и я не знал об этом, пока они мне не сказали.
В других частях моего приложения, не связанных с колбой, я написал пользовательский декоратор, чтобы перехватывать все исключения, отправлять мне электронное письмо, а затем повторно бросать. Я хотел бы что-то подобное для своего приложения Flask.
Я хочу найти способ, чтобы Flask вызывал мою функцию каждый раз, когда мой код обработчика создает исключение, прежде чем он вернет ответ клиенту. Я не хочу изменять ответ, который отправляется клиенту. Я не хочу менять то, как Flask обрабатывает ошибки или как он их улавливает. Я просто хочу каким-то образом получать уведомления, а затем Flask может продолжить обработку ошибок по умолчанию.
Я полагаю, что я мог бы поставить декоратора над каждым обработчиком маршрута, чтобы перехватывать и перестраивать исключения до того, как их увидит Flask, но это грязно. Я просто знаю, что забуду один из них, особенно когда добавлю новые в будущем.
МВЕ
Приложение с ошибками:
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
assert False, "buggy code here"
return "hello"
def error_handler(exc_type, exc_val, exc_tb):
send_email(exc_type, exc_val, exc_tb)
# This is the part I don't know
# I want something along the lines of:
app.config['ERROR_HOOK'] = error_handler
Ответ №1:
from flask import Flask
app = Flask(__name__)
app.debug = False
app.config['PROPAGATE_EXCEPTIONS'] = True
@app.errorhandler(Exception)
def all_exception_handler(error):
print(str(error))
@app.errorhandler(404)
def page_not_found(error):
return 'This page does not exist', 404
вы можете определить функцию для каждой конкретной ошибки, которую вы хотите поймать @app.my_custom_errorhandler(code_or_exception)
Аргументом функции обработчика ошибок будет значение an Exception
.