51

私はFlaskのエラーキャッチが大好きです。それは美しくシンプルです:

@app.errorhandler(404)
def pageNotFound(error):
    return "page not found"

魅力のように機能します。ただし、500エラーコードでは機能しません。何かがうまくいかないときにPythonエラーをキャッチしたいのですが、コードで例外が発生します。それは可能ですか?

return abort(500)ビューを明示的に呼び出すと、500エラーハンドラーが機能することに注意してください。したがって、これはPythonコードが失敗した場合に明示的に使用されます。

これは可能ですか?

4

6 に答える 6

43

あなたが説明したのは、デフォルトでは、Flaskがどのように機能するかです。私の想定では、デバッグモードで実行しているため、デバッグ画面に例外が表示されます。デバッグモードがオフになっていることを確認してから、再試行してください。コード自体からの直接のコメントは次のとおりです。

キャッチされない例外が発生したときに開始されるデフォルトの例外処理。デバッグモードでは、例外はすぐに再発生します。それ以外の場合は、ログに記録され、500内部サーバーエラーのハンドラーが使用されます。そのようなハンドラーが存在しない場合、デフォルトの500内部サーバーエラーメッセージが表示されます。

于 2013-02-21T14:22:19.087 に答える
25

それは私の側ではうまく機能します:

from flask import Flask ,url_for,render_template,request,abort
from  werkzeug.debug import get_current_traceback
app = Flask(__name__)

@app.route('/')
def index():
    try:
        raise Exception("Can't connect to database")
    except Exception,e:
        track= get_current_traceback(skip=1, show_hidden_frames=True,
            ignore_system_exceptions=False)
        track.log()
        abort(500)
    return "index"

@app.errorhandler(500)
def internal_error(error):

    return "500 error"

@app.errorhandler(404)
def not_found(error):
    return "404 error",404

if __name__== "__main__":
    app.run(debug=True)

Flaskはエラーコードを設定しないため、応答を返すときにHTTPステータスコードも提供するようにしてください。

于 2013-02-21T02:37:46.253 に答える
20

これが私のコードスニップです

@app.route('/')
def index():
    raise Exception("Can't connect to database")


@app.errorhandler(Exception)
def exception_handler(error):
    return "!!!!"  + repr(error)
于 2015-02-26T09:13:01.423 に答える
15

これに対する私の解決策は、構成ディクショナリを変更することにより、例外の伝播をオンにすることでした。

app = Flask(__name__)
...
app.config['PROPAGATE_EXCEPTIONS'] = True

この他の関連する質問を見てください:Flaskアプリは例外なく500エラーを発生させます

于 2016-06-22T13:11:22.613 に答える
4

問題は、コード内ですべての例外が存在するわけではないことですが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
于 2020-05-23T20:23:27.857 に答える
-1

このコードは500ステータスコードをキャッチし、例外エラーを取得します

@app.errorhandler(Exception)
def all_exception_handler(e):
    error = str(traceback.format_exc())
于 2019-07-11T05:23:20.110 に答える