error-handling
Обработка ошибок
- используйте
route.get(errors=VioletsAreBlue)
для объявления ответа endpoint'а
class VioletsAreBlue(HTTPException[str]):
"how about you?"
__status__ = 418
@lhl.post(errors=VioletsAreBlue)
async def roses_are_red():
raise VioletsAreBlue("I am a pythonista")
- используйте
lihil.problems.problem_solver
как декоратор для регистрации обработчика ошибок, ошибка будет обработана как Problem Detail.
from lihil.problems import problem_solver
# ПРИМЕЧАНИЕ: вы можете использовать объединение типов для exc, например, UserNotFound | status.NOT_FOUND
@problem_solver
def handle_404(req: Request, exc: Literal[404]):
return Response("resource not found", status_code=404)
Обработчик, который обрабатывает конкретный тип исключения (например, UserNotFound
), имеет приоритет над обработчиком, который обрабатывает статус-код (например, 404
).
Сопоставление исключение-проблема
lihil автоматически генерирует ответ и документацию на основе вашего HTTPException.
Вот сгенерированная документация для endpoint'а roses_are_red
нажмите url под вкладкой External documentation
мы увидим подробную страницу проблемы
По умолчанию каждый endpoint будет иметь как минимум один ответ с кодом 422
для InvalidRequestErrors
.
Вот один пример ответа для InvalidRequestErrors
.
{
"type_": "invalid-request-errors",
"status": 422,
"title": "Missing",
"detail": [
{
"type": "MissingRequestParam",
"location": "query",
"param": "q",
"message": "Param is Missing"
},
{
"type": "MissingRequestParam",
"location": "query",
"param": "r",
"message": "Param is Missing"
}
],
"instance": "/users"
}
- Чтобы изменить создание ответа, используйте
lihil.problems.problem_solver
для регистрации вашего обработчика. - Чтобы изменить документацию, переопределите
DetailBase.__json_example__
иDetailBase.__problem_detail__
. - Чтобы расширить детали ошибки, предоставьте typevar при наследовании
HTTPException[T]
.