eigent/backend/app/exception/handler.py
2025-08-12 01:16:39 +02:00

63 lines
2 KiB
Python

import traceback
from fastapi import Request
from fastapi.encoders import jsonable_encoder
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse
from loguru import logger
from app import api
from app.component import code
from app.exception.exception import NoPermissionException, ProgramException, TokenException
from app.component.pydantic.i18n import trans, get_language
from app.exception.exception import UserException
@api.exception_handler(RequestValidationError)
async def request_exception(request: Request, e: RequestValidationError):
if (lang := get_language(request.headers.get("Accept-Language"))) is None:
lang = "en_US"
return JSONResponse(
content={
"code": code.form_error,
"error": jsonable_encoder(trans.translate(list(e.errors()), locale=lang)),
}
)
@api.exception_handler(TokenException)
async def token_exception(request: Request, e: TokenException):
return JSONResponse(content={"code": e.code, "text": e.text})
@api.exception_handler(UserException)
async def user_exception(request: Request, e: UserException):
return JSONResponse(content={"code": e.code, "text": e.description})
@api.exception_handler(NoPermissionException)
async def no_permission(request: Request, exception: NoPermissionException):
return JSONResponse(
status_code=200,
content={"code": code.no_permission_error, "text": exception.text},
)
@api.exception_handler(ProgramException)
async def program_exception(request: Request, exception: NoPermissionException):
return JSONResponse(
status_code=200,
content={"code": code.program_error, "text": exception.text},
)
@api.exception_handler(Exception)
async def global_exception_handler(request: Request, exc: Exception):
logger.error(f"Unhandled error: {exc}")
traceback.print_exc() # output to electron log
return JSONResponse(
status_code=500,
content={
"code": 500,
"message": str(exc),
},
)