在Flask中捕获500服务器错误
我很喜欢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内部服务器错误信息。