问题在于,在代码中,并非所有 Exceptions 都是HTTPException
,但 Flask 默认捕获这些并返回通用的 500 错误响应(可能包括也可能不包括 @Mark Hildreth 描述的原始错误消息)。因此, using@app.errorhandler(500)
不会捕获这些错误,因为这发生在 Flask 返回通用 500 错误之前。
您需要有一个errorhandler(Exception)
类似于except Exception:
python 的泛型,它可以捕获所有内容。Flask 托盘项目提供了一个很好的解决方案:
from werkzeug.exceptions import HTTPException
@app.errorhandler(Exception)
def handle_exception(e):
# pass through HTTP errors. You wouldn't want to handle these generically.
if isinstance(e, HTTPException):
return e
# now you're handling non-HTTP exceptions only
return render_template("500_generic.html", e=e), 500
如果您愿意,还可以返回 JSON,如果您处于调试模式,还可以包含原始错误消息。例如
from flask import jsonify
from werkzeug.exceptions import HTTPException
debug = True # global variable setting the debug config
@app.errorhandler(Exception)
def handle_exception(e):
if isinstance(e, HTTPException):
return e
res = {'code': 500,
'errorType': 'Internal Server Error',
'errorMessage': "Something went really wrong!"}
if debug:
res['errorMessage'] = e.message if hasattr(e, 'message') else f'{e}'
return jsonify(res), 500