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

How to respond with HTTP 500 on any unhandled exception in Falcon framework

Falcon 框架中是否有一种方法可以在资源处理程序中未处理的任何非特定异常上以 HTTP 500 状态响应?我尝试为异常添加以下处理程序:

api.add_error_handler(Exception, 
                      handler=lambda e, 
                      *_: exec('raise falcon.HTTPInternalServerError("Internal Server Error", "Some error")'))

但这使得无法抛出,例如,falcon.HTTPNotFound — 它由上面的处理程序处理,我收到 500 而不是 404。

我不确定我是否正确理解你的问题。

但您可以使用以下方法 return 响应任何非特定异常的 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())

是的,这是可能的。您需要定义一个通用错误处理程序,检查异常是否是任何猎鹰错误的实例,如果不是,则提高您的 HTTP_500.

此示例展示了一种实现方法。

def generic_error_handler(ex, req, resp, params):
    if not isinstance(ex, HTTPError):
        raise HTTPInternalServerError("Internal Server Error", "Some error")
    else:  # reraise :ex otherwise it will gobble actual HTTPError returned from the application code ref. 
        raise ex

app = falcon.API()
app.add_error_handler(Exception, generic_error_handler)

接受的答案似乎吞噬了从应用程序代码返回的实际 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