在Falcon框架中是否有办法在资源处理程序中未处理的任何非特定异常上响应HTTP 500状态?我试图为Exception添加以下处理程序:
api.add_error_handler(Exception,
handler=lambda e,
*_: exec('raise falcon.HTTPInternalServerError("Internal Server Error", "Some error")'))
但这不可能抛出,例如,falcon.HTTPNotFound
- 它由上面的处理程序处理,我收到500而不是404。
答案 0 :(得分:2)
是的,有可能。您需要定义一个通用错误处理程序,检查该异常是否是任何猎鹰错误的实例,如果不是,则引发HTTP_500。
此示例显示了一种实现方法。
def generic_error_handler(ex, req, resp, params):
if not isinstance(ex, HTTPError):
raise HTTPInternalServerError("Internal Server Error", "Some error")
app = falcon.API()
app.add_error_handler(Exception, generic_error_handler)
答案 1 :(得分:2)
接受的答案似乎使从应用程序代码返回的实际HTTPError
不足。这对我有用:
def generic_error_handler(ex, req, resp, params):
if not isinstance(ex, HTTPError):
logger.exception("Internal server error")
raise HTTPInternalServerError("Internal Server Error")
else:
raise ex
答案 2 :(得分:1)
我不确定我是否理解你的问题。
但您可以使用以下方法在任何非特定异常上以HTTP 500状态返回响应:
class MyFirstAPI:
def on_post(self, req, res):
try:
json_data = json.loads(req.stream.read().decode('utf8'))
# some task
res.status = falcon.HTTP_200
res.body = json.dumps({'status': 1, 'message': "success"})
except Exception as e:
res.status = falcon.HTTP_500
res.body = json.dumps({'status': 0,
'message': 'Something went wrong, Please try again'
})
app = falcon.API()
app.add_route("/my-api/", MyFirstAPI())
或者您也可以在python中使用装饰器,如下所示:
def my_500_error_decorator(func):
def wrapper(*args):
try:
func(*args)
except Exception as e:
resp.status = falcon.HTTP_500
resp.body = json.dumps({'status': 0, 'message': 'Server Error'})
return wrapper
class MyFirstAPI:
@my_500_error_decorator
def on_post(self, req, res):
try:
json_data = json.loads(req.stream.read().decode('utf8'))
# some task
res.status = falcon.HTTP_200
res.body = json.dumps({'status': 1, 'message': "success"})
app = falcon.API()
app.add_route("/my-api/", MyFirstAPI())