异常捕获装饰器,python
·
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
更多推荐
所有评论(0)