Из-за чего не перехватывается исключение Exception?

Ссылка скопирована
1 ответ

Сейчас ситуация такая: пытаюсь сделать обработчик ошибок но, он по какой-то причине не работает, хотя сделанный по аналогии обработчик для HTTPException отлично работает.
По вводным: пытаюсь перехватить при помощи

async def global_exception_handler(request: Request, exc: Exception): "глобальный обработчик ошибок" return JSONResponse( status_code=500, content={"error": "Internal server error (from global_exception_handler)"} )

Вызываю в ендпоинте

@router.get("/awdawd/dawdaw") async def adwad(): raise Exception

Но вижу просто

File *PATH*, line 411, in adwad
raise Exception
Exception

Сейчас ситуация такая: пытался вызвать его делением на 0. Результат тот же(global_exception_handler не срабатывает)
При этом есть

async def custom_exception_handler(request: Request, exc: CustomException): "обработчик ошибок пока только в get by id" error = jsonable_encoder( CustomExceptionModel(status_code=exc.status_code, er_message=exc.message, er_details=exc.detail)) return JSONResponse(status_code=exc.status_code, content=error)

По вводным: который отрабатывает, правда его я вызываю напрямую через raise CustomException.
Регистрация в мейн:

app.add_exception_handler(CustomException, custom_exception_handler) app.add_exception_handler(Exception, global_exception_handler)
Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Андрей PHP Ответ

В FastAPI глобальный обработчик Exception должен работать, если он зарегистрирован на том же объекте app, через который реально обслуживается приложение, и если ошибка не перехватывается middleware/DebugServer раньше. Чаще всего причина в регистрации не там, включённом debug traceback или в том, что вы смотрите консольный traceback и думаете, что handler не сработал.

Минимальный рабочий пример:

from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse
 
app = FastAPI(debug=False)
 
@app.exception_handler(Exception)
async def global_exception_handler(request: Request, exc: Exception):
    return JSONResponse(
        status_code=500,
        content={"error": "Internal server error"}
    )
 
@app.get("/test")
async def test():
    raise Exception("boom")

from fastapi import FastAPI, Request from fastapi.responses import JSONResponse app = FastAPI(debug=False) @app.exception_handler(Exception) async def global_exception_handler(request: Request, exc: Exception): return JSONResponse( status_code=500, content={"error": "Internal server error"} ) @app.get("/test") async def test(): raise Exception("boom")

Если вы используете router, это не важно: исключение из endpoint всё равно должно дойти до app-level handler. Но регистрация должна быть именно на объекте app, который запускается uvicorn-ом:

uvicorn main:app --reload

uvicorn main:app --reload

Проверьте, что у вас нет двух разных app: один создаётся в main.py, другой импортируется в тестах/роутерах. Типичная ошибка — зарегистрировать handler на одном экземпляре, а запускать другой.

Ещё момент: при debug=True Starlette может показывать debug traceback. В консоли traceback всё равно может печататься даже при работающем handler — важен HTTP-ответ клиенту. Проверьте через curl:

curl -i http://127.0.0.1:8000/awdawd/dawdaw

curl -i http://127.0.0.1:8000/awdawd/dawdaw

Также убедитесь, что регистрация выглядит так:

app.add_exception_handler(Exception, global_exception_handler)

app.add_exception_handler(Exception, global_exception_handler)

а не случайно добавлена после запуска приложения или в модуле, который не импортируется.

Итог: глобальный handler для Exception в FastAPI работает. Ищите второй экземпляр app, debug middleware, порядок регистрации и проверяйте реальный HTTP-ответ, а не только traceback в терминале.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно