Метод exception_handler
Метод exception_handler применяется к приложению
FastAPI и регистрирует функцию-обработчик для указанного
класса исключения. Первым параметром передаётся класс
исключения exc_class, который требуется перехватить.
Метод работает как декоратор: возвращает декоратор,
оборачивающий функцию-обработчик. Функция-обработчик
принимает объект запроса request и объект исключения
exc, а возвращает объект ответа Response.
FastAPI использует зарегистрированные обработчики для
перехвата исключений, возникающих при обработке запросов.
Если для исключения не найден обработчик, применяется
обработчик по умолчанию. Метод exception_handler
позволяет задать собственное поведение при ошибках.
Синтаксис
@app.exception_handler(exc_class)
Пример
Давайте зарегистрируем обработчик для встроенного
исключения ValueError и вернём собственный JSON-ответ:
from fastapi import FastAPI
from fastapi.responses import JSONResponse
app = FastAPI()
@app.exception_handler(ValueError)
async def value_error_handler(request, exc):
return JSONResponse(
status_code=400,
content={'message': 'value error'},
)
@app.get('/user')
def get_user():
raise ValueError('bad value')
Результат выполнения кода для адреса /user:
{"message": "value error"}
Пример
Давайте создадим собственный класс исключения и зарегистрируем для него обработчик:
from fastapi import FastAPI
from fastapi.responses import JSONResponse
app = FastAPI()
class UserNotFound(Exception):
pass
@app.exception_handler(UserNotFound)
async def user_not_found_handler(request, exc):
return JSONResponse(
status_code=404,
content={'message': 'user not found'},
)
@app.get('/user')
def get_user():
raise UserNotFound()
Результат выполнения кода для адреса /user:
{"message": "user not found"}
Пример
Давайте перехватим исключение RequestValidationError
и вернём ошибку в собственном формате:
from fastapi import FastAPI
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse
app = FastAPI()
@app.exception_handler(RequestValidationError)
async def validation_handler(request, exc):
return JSONResponse(
status_code=422,
content={'message': 'validation error'},
)
@app.get('/user')
def get_user(age: int):
return {'age': age}
Результат выполнения кода для адреса /user?age=abcde:
{"message": "validation error"}
Смотрите также
-
метод
add_exception_handler,
который регистрирует обработчик исключения без декоратора -
метод
middleware,
который добавляет промежуточное ПО в приложение -
класс
FastAPI,
который представляет приложение FastAPI -
метод
api_route,
который вешает обработчик на произвольный HTTP-метод