在学习Flask-Restful写API的时候发现了一个奇怪的现象:
当pycharm运行flask时,debug模式和非debug模式下,相同的代码有不同的表现。
非debug模式:
故意抛出的自定义异常,竟然报出了HTTP错误。
debug模式:
在才是想要的报错。
查找资料之后发现,原来是Flask-Restful的问题。
非debug模式下,自定义异常被@api.representation统一处理了,没有经过@app.errorhandler,所以才会有两种模式下两种不同的结果。
处理办法是让api只处理HTTPExceptions和Flask-Restful自己定义的错误。
我们需要改写API的error_router方法:
from flask_restful import Api as _Api
from werkzeug.exceptions import HTTPException
class Api(_Api):
def error_router(self, original_handler, e):
""" Override original error_router to only handle HTTPExceptions. """
if self._has_fr_route() and isinstance(e, HTTPException):
try:
return self.handle_error(e)
except Exception:
pass # Fall through to original handler
return original_handler(e)
api = Api()
参考文章: