import asyncio
from functools import wraps
import logging
from typing import Any, Callable
import traceback
try:
    from utils.log import logger
except ImportError:
    logger = logging.getLogger(__name__)
    
# 异常捕获装饰器
def catch_exception(default_return=None, reraise=False, logger=logger):
    """
    异常捕获装饰器
    参数:
        default_return: 发生异常时的默认返回值
        reraise: 是否重新抛出异常
        logger: 日志记录器
    """
    def decorator(func: Callable) -> Callable:
        if asyncio.iscoroutinefunction(func):
            # 异步函数版本
            @wraps(func)
            async def async_wrapper(*args, **kwargs) -> Any:
                try:
                    return await func(*args, **kwargs)
                except Exception as e:
                    logger.error(f"{e}\n{traceback.format_exc()}")
                    if reraise:
                        raise
                    return default_return
            return async_wrapper
        else:
            # 同步函数版本
            @wraps(func)
            def sync_wrapper(*args, **kwargs) -> Any:
                try:
                    return func(*args, **kwargs)
                except Exception as e:
                    logger.error(f"{e}\n{traceback.format_exc()}")
                    if reraise:
                        raise
                    return default_return
            return sync_wrapper
    return decorator

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐