File size: 1,519 Bytes
76b9762
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from contextlib import asynccontextmanager
from fastapi import HTTPException
import logging

@asynccontextmanager
async def handle_route_errors(logger: logging.Logger, operation_name: str, success_message: str = None, failure_message: str = None):
    """
    一个异步上下文管理器,用于统一处理 FastAPI 路由中的常见错误和日志记录。

    Args:
        logger: 用于记录日志的 Logger 实例。
        operation_name: 操作的名称,用于日志记录和错误详情。
        success_message: 操作成功时记录的自定义消息 (可选)。
        failure_message: 操作失败时记录的自定义消息 (可选)。
    """
    default_success_msg = f"{operation_name} request successful"
    default_failure_msg = f"{operation_name} request failed"

    logger.info("-" * 50 + operation_name + "-" * 50)
    try:
        yield
        logger.info(success_message or default_success_msg)
    except HTTPException as http_exc:
        # 如果已经是 HTTPException,直接重新抛出,保留原始状态码和详情
        logger.error(f"{failure_message or default_failure_msg}: {http_exc.detail} (Status: {http_exc.status_code})")
        raise http_exc
    except Exception as e:
        # 对于其他所有异常,记录错误并抛出标准的 500 错误
        logger.error(f"{failure_message or default_failure_msg}: {str(e)}")
        raise HTTPException(
            status_code=500, detail=f"Internal server error during {operation_name}"
        ) from e