在Flask中捕获500服务器错误

时间:2013-02-21 01:54:53

标签: python flask

我喜欢Flask的错误捕捉。这很简单:

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

就像魅力一样。但它不适用于500错误代码。我想在出现问题时捕获Python错误,在代码中引发异常。这可能吗?

我应该注意,如果我在视图中明确调用return abort(500),则500错误处理程序可以正常工作。所以这明确适用于Python代码失败的时候。

这可能吗?

6 个答案:

答案 0 :(得分:34)

默认情况下,您所描述的是Flask的工作原理。我的假设是您在调试模式下运行,因此在调试屏幕中向您显示异常。确保调试模式已关闭,然后重试。这是comment directly from the code itself:

  

发生异常时启动的默认异常处理   没被抓住。在调试模式下,将重新引发异常   立即,否则记录和500内部的处理程序   使用服务器错误。如果不存在此类处理程序,则默认为500   显示内部服务器错误消息。

答案 1 :(得分:23)

它在我身边很好用:

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状态代码。

答案 2 :(得分:15)

这是我的代码段

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


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

答案 3 :(得分:12)

我的解决方案是通过修改配置字典来打开异常的传播:

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

请看其他相关问题:Flask app raises a 500 error with no exception

答案 4 :(得分:1)

问题在于,在代码内,并非所有的异常都是HTTPException,但是Flask默认情况下会捕获它们并返回通用的500错误响应(可能包含也可能不包含@Mark描述的原始错误消息)希尔德雷斯)。因此,使用@app.errorhandler(500)不会捕获这些错误,因为这是在Flask返回通用500错误之前发生的。

您将需要一个通用的errorhandler(Exception),其工作方式类似于python中的except Exception:,它可以捕获所有内容。 Flask pallets projects中提供了一个很好的解决方案:

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

答案 5 :(得分:0)

此代码捕获500个状态代码并获得异常错误

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