在 Flask 中处理(不捕获)异常的钩子

Hook for processing (not catching) exception in Flask

我有一个 Flask 服务器。

每当我的处理程序中的代码抛出异常时,Flask 都会捕获它,并且 returns 向客户端发送一个 HTML 页面并显示 5XX 错误。

问题是我没有注意到这一点。我刚收到一封使用我的 API 的人发来的电子邮件,说他们收到 504 错误,直到他们告诉我我才知道。

在我的应用程序的其他非 Flask 部分,我编写了一个自定义装饰器来捕获所有异常,向我发送电子邮件,然后重新抛出。我想要类似的东西用于我的 Flask 应用程序。

我想找到一种方法,让 Flask 在我的处理程序代码每次抛出异常时调用我的函数,然后再 returns 对客户端的响应。我不想修改发送给客户端的响应。我不想改变 Flask 处理错误的方式,或者它捕获错误的方式。我只是想要一些被通知的方式,然后 Flask 可以继续执行默认的错误处理行为。

我想我可以在每个路由处理程序上放置一个装饰器,以便在 Flask 看到异常之前捕获并重新抛出异常,但这很麻烦。我只知道我会忘记其中一个,尤其是当我以后添加新的时。

MWE

有问题的应用程序:

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

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

您可以 define a function 针对每个要捕获的特定错误 @app.my_custom_errorhandler(code_or_exception)

您的错误处理函数的参数将是一个 Exception