如何使用HTTP 500响应Falcon框架中任何未处理的异常

时间:2016-09-19 10:16:00

标签: python http falconframework

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。

3 个答案:

答案 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())