在Flask中捕获500服务器错误

64 投票
6 回答
104635 浏览
提问于 2025-04-17 16:34

我很喜欢Flask的错误捕捉功能。它简单得美妙:

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

效果很好。但是它对500错误代码不起作用。我想在代码出错、抛出异常时捕捉Python错误。这可能吗?

我需要说明的是,如果我在视图中明确调用return abort(500),那么500错误处理器就会生效。所以我说的这个情况是指当Python代码失败时。

这可能吗?

6 个回答

23

这是我的代码片段

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


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

在我这边运行得很好:

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

51

你描述的情况其实就是Flask默认的工作方式。我猜测你是在调试模式下运行,所以错误信息会在调试界面上显示出来。确保调试模式关闭后再试一次。这里有一段直接来自代码的注释:

这是默认的错误处理方式,当出现未被捕获的错误时会启动。在调试模式下,错误会立即被重新抛出;如果不是调试模式,错误信息会被记录下来,并使用一个处理500内部服务器错误的方式。如果没有这样的处理方式,就会显示一个默认的500内部服务器错误信息。

撰写回答