問題は、コード内ですべての例外が存在するわけではないことですがHTTPException
、Flaskはデフォルトでこれらをキャッチし、一般的な500エラー応答を返します(@Mark Hildrethで説明されている元のエラーメッセージが含まれる場合と含まれない場合があります)。したがって、@app.errorhandler(500)
Flaskが一般的な500エラーを返す前にこれが発生するため、を使用してもこれらのエラーはキャッチされません。
すべてをキャプチャするPythonerrorhandler(Exception)
と同様に機能するジェネリックが必要になります。except Exception:
良い解決策は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