Перейти к содержанию

Исключения

Starlette позволяет устанавливать пользовательские обработчики исключений для обработки того, как вернуть ответ в случае ошибки или обработанных исключений.

Из Starlette.applications Import Starlette
from starlette.exceptions import HTTPException
Из starlette.requests import Request
from starlette.responses import HTMLResponse


HTML_404_PAGE =…
HTML_500_PAGE =…


async def not_found (request: Request, exc: HTTPException)
    return HTMLResponse(content=HTML_404_PAGE, status_code = exc.status)

async def serverver_error (request: Request, exc: HTTPException)
    return HTMLResponse(content=HTML_500_PAGE, status_code = exc.status)


exception_handlers = {
    404: not found,
    500: erver_error
}

app = Starlette(routes=routes, exception_handlers = exception_handlers)

Если debug включен и возникает ошибка, Starlette будет использовать обратную реакцию вместо установленного обработчика 500.

app = Starlette(debug=True, routes=routes, exception_handlers = exception_handlers)

Помимо регистрации обработчика для определенного кода состояния, вы можете также зарегистрировать обработчика для класса исключений.

В частности, вы можете захотеть переопределить способ обработки встроенного класса HTTPException. Например, ответ с помощью стиля JSON:

async def http_exception (request: Request, exc: HTTP Exception):
    return JSONResponse({"detail": exc.detail}, status_code = exc.status)

exception_handlers = {
    HTTP Exception: http_exception
}

HTTPException также поставляется с параметром headers. Это позволяет распространять заголовки в классы ответов:

async def http_exception (request: Request, exc: HTTP Exception):
    Рекорд (
        {"detail": exc.detail},
        status_code = exc.status,
        Headers= exc.headers
    )

Вы также можете переопределить обработку WebSocketException:

async def websocket_exception (websocket: WebSocket, exc: WebSocketException):
    websocket.close(код =1008)

exception_handlers = {
    WebSocketException: websocket_exception
}

Ошибки и обработанные исключения

Важно различать исключения и ошибки, которые были обработаны.

Обработанные исключения не являются ошибками. Они принудительно преобразуются в соответствующие HTTP-ответы и отправляются через стандартный промежуточный стек. По умолчанию для управления всеми обработанными исключениями используется класс HTTPException.

Ошибки-это любые другие исключения, которые происходят в приложении. Эти случаи должны всплывать по всему стеку промежуточного ПО как исключения. Любая запись в журнале ошибок промежуточного ПО должна гарантировать, что ошибка будет вновь загружена на сервер.

На самом деле, ошибки обрабатываются как exception_handler[500] или exception_handler[Exception]. Можно использовать оба ключа:500 и Exception. См. ниже:

async def handle_error (request: Request, exc: HTTPException)
    # Perform Some Logic
    return JSONResponse({"detail": exc.detail}, status_code = exc.status)

exception_handlers = {
    Исключение: handle_error #или "500: handle_error"
}

Обратите внимание, что если BackgroundTask вызывает исключение, то это будет обрабатываться функцией handle_error, но ответ уже отправлен. Другими словами, ответ, созданный handle_error, будет удален. Если ошибка произошла до отправки ответа, то будет использоваться объект ответа-в приведенном выше примере для возвращаемого JSONResponse.

Чтобы правильно обработать это поведение, стек промежуточного программного обеспечения для приложений Starlette настроен так:

  • ServerErrorMiddleware - Возвращает 500 ответов, когда сервер обнаруживает ошибку.
  • Установленные промежуточные компоненты
  • ExceptionMiddleware - Обработка обработанных исключений и возвращение ответа.
  • Маршрутизатор
  • Конечная точка

Исключение HTTP

Класс HTTPException предоставляет базовый класс, который вы можете использовать для любых обработанных исключений. Реализация ExceptionMiddleware по умолчанию возвращает простой текстовый HTTP-ответ для любого HTTPException.

  • HTTPException(status_code, detail=None, headers=None)

Вы должны запускать HTTPException только внутри маршрута или конечной точки. Вместо этого класс промежуточного ПО должен напрямую возвращать соответствующий ответ.

Ошибка WebSocket

Класс WebSocketException можно использовать для генерирования ошибок внутри конечных точек WebSocket.

  • WebSocketException(code=1008, reason=None)

Можно задать любой допустимый код, определенный в спецификации.