Flask 项目里想统一捕获所有异常,文档里通常这样写:
1 |
|
但在我项目里怎么都不生效——异常总是从 flask_restx 打出,返回 internal server error。
原因
怀疑是 flask_restx(或 flask_restful)在框架层提前抓住了异常,没有往上抛,Flask 自然接不到。
翻了一下 flask_restx 源码,尤其是 flask_restx.api.Api.handle_error 方法,发现在某种判断条件下,flask_restx 会把异常吞掉而不是继续向上传递。
解决办法
加一行配置即可:
1 | app.config['PROPAGATE_EXCEPTIONS'] = True |
开启后异常会传播到 Flask 的全局 handler,问题就解决了。