Из-за чего не перехватывается исключение Exception?
Сейчас ситуация такая: пытаюсь сделать обработчик ошибок но, он по какой-то причине не работает, хотя сделанный по аналогии обработчик для 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)
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
В 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")
Если вы используете router, это не важно: исключение из endpoint всё равно должно дойти до app-level handler. Но регистрация должна быть именно на объекте
app, который запускается uvicorn-ом:uvicorn main:app --reloaduvicorn main:app --reload
Проверьте, что у вас нет двух разных app: один создаётся в
main.py, другой импортируется в тестах/роутерах. Типичная ошибка — зарегистрировать handler на одном экземпляре, а запускать другой.Ещё момент: при
debug=TrueStarlette может показывать debug traceback. В консоли traceback всё равно может печататься даже при работающем handler — важен HTTP-ответ клиенту. Проверьте через curl:curl -i http://127.0.0.1:8000/awdawd/dawdaw
Также убедитесь, что регистрация выглядит так:
app.add_exception_handler(Exception, global_exception_handler)
а не случайно добавлена после запуска приложения или в модуле, который не импортируется.
Итог: глобальный handler для
Exceptionв FastAPI работает. Ищите второй экземпляр app, debug middleware, порядок регистрации и проверяйте реальный HTTP-ответ, а не только traceback в терминале.