Крючок для обработки (не улавливания) исключения в колбе

#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 .