Как отвечать HTTP 500 на любое необработанное исключение в рамках Falcon

70
5

Есть ли способ в структуре Falcon ответить на статус HTTP 500 на любом неспецифическом исключении, которое не обрабатывается в обработчике ресурсов? Я попытался добавить следующий обработчик для исключения:

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

Но это делает невозможным бросить, например, falcon.HTTPNotFound - обрабатывается обработчиком выше, и я получаю 500 вместо 404.

спросил(а) 2016-09-19T13:16:00+03:00 4 года, 1 месяц назад
1
Решение
70

Да, это возможно. Вам нужно определить общий обработчик ошибок, проверить, является ли исключение экземпляром любой ошибки falcon, а если нет, то поднимите свой 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)

ответил(а) 2018-09-23T12:48:00+03:00 2 года назад
58

Я не уверен, правильно ли я понимаю ваш вопрос или нет.

Но вы можете использовать следующий подход, чтобы вернуть ответ на статус 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())

Или вы также можете использовать Decorators в 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())

ответил(а) 2017-03-05T20:25:00+03:00 3 года, 7 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема