Поймай "Exception" в быстром api по всему миру - PullRequest
1 голос
/ 04 мая 2020

Я очень новый python и Фастапи. Я пытаюсь поймать необработанные исключения на глобальном уровне. Итак, где-то в main.py файле я пишу ниже:

@app.exception_handler(Exception)
async def exception_callback(request: Request, exc: Exception):
  logger.error(exc.detail)

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

class MyException(Exception):
  #some code

@app.exception_handler(MyException)
async def exception_callback(request: Request, exc: MyException):
  logger.error(exc.detail)

Я прошел Поймать тип исключения Исключение и запрос тела процесса # 575 . Но эта ошибка говорит о доступе к телу запроса. Увидев эту ошибку, я чувствую, что можно поймать Exception. Версия FastApi fastapi>=0.52.0.

Заранее спасибо:)

1 Ответ

0 голосов
/ 05 мая 2020

Сначала я приглашаю познакомиться с базовыми классами исключений в python. Вы можете прочитать их в документе Встроенные исключения

Во-вторых, прочитать переопределение поведения исключений по умолчанию fastApi Переопределить обработчики исключений по умолчанию

Что Вы должны понимать, что @app.exception_handler принимает любые исключения или дочерние классы, полученные из Exception. Например, RequestValidationError - это подкласс python, встроенный в ValueError, который сам является подклассом Exception.

Таким образом, вы должны создать свои собственные исключения или выбросить доступные исключения с этим фоном. Я предполагаю, что что-то пошло не так с вашим логгером logger.error(exc.detail), который либо не имеет детального поля, либо не имеет правильной конфигурации логгера.

Пример кода:

@app.get("/")
def read_root(response: Response):
    raise ArithmeticError("Divide by zero")


@app.exception_handler(Exception)
async def validation_exception_handler(request, exc):
    print(str(exc))
    return PlainTextResponse("Something went wrong", status_code=400)

Вывод:

Запись stdout и ответ с Something went wrong

...