web-dev-qa-db-fra.com

Attraper une erreur de serveur 500 dans Flask

J'adore la capture d'erreur de Flask. C'est magnifiquement simple:

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

fonctionne comme du charme. Mais cela ne fonctionne pas pour le code d'erreur 500. Je veux intercepter les erreurs Python en cas de problème, une exception est déclenchée dans le code. Est-ce possible?

Je dois noter que si j'appelle explicitement return abort(500) dans une vue, le gestionnaire d'erreurs 500 fonctionne. C'est donc explicitement pour quand le code Python échoue.

Est-ce possible?

42
J-bob

Ce que vous avez décrit est, par défaut, comment fonctionne Flask. Mon hypothèse est que vous exécutez en mode débogage, et donc des exceptions vous sont affichées dans l'écran de débogage. Assurez-vous que le mode débogage est désactivé, puis réessayez. Voici un commentaire directement à partir du code lui-même:

Gestion des exceptions par défaut qui se déclenche lorsqu'une exception n'est pas détectée. En mode débogage, l'exception sera immédiatement relancée, sinon elle est enregistrée et le gestionnaire d'une erreur de serveur interne 500 est utilisé. Si un tel gestionnaire n'existe pas, un message d'erreur de serveur interne 500 par défaut s'affiche.

35
Mark Hildreth

Ça marche bien de mon côté:

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 ne définira pas le code d'erreur pour vous, alors assurez-vous de fournir également le code d'état HTTP lors du retour d'une réponse.

23
Joe

voici mon extrait de code

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


@app.errorhandler(Exception)
def exception_handler(error):
    return "!!!!"  + repr(error)
16
WebQube

Ma solution à cela a été d'activer la propagation des exceptions, en modifiant le dictionnaire de configuration:

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

Regardez cette autre question connexe: l'application Flask soulève une erreur 500 sans exception

12
elachell

ce code attrape 500 code d'état et obtient une erreur d'exception

@app.errorhandler(Exception)
def all_exception_handler(e):
    error = str(traceback.format_exc())
0
hmir