我喜欢Flask的错误捕捉。这很简单:
@app.errorhandler(404)
def pageNotFound(error):
return "page not found"
就像魅力一样。但它不适用于500错误代码。我想在出现问题时捕获Python错误,在代码中引发异常。这可能吗?
我应该注意,如果我在视图中明确调用return abort(500)
,则500错误处理程序可以正常工作。所以这明确适用于Python代码失败的时候。
这可能吗?
答案 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
答案 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())