Spaces:
Running
Running
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
""" | |
@Time : 2023/12/19 14:46 | |
@Author : alexanderwu | |
@File : exceptions.py | |
""" | |
import asyncio | |
import functools | |
import traceback | |
from typing import Any, Callable, Tuple, Type, TypeVar, Union | |
from metagpt.logs import logger | |
ReturnType = TypeVar("ReturnType") | |
def handle_exception( | |
_func: Callable[..., ReturnType] = None, | |
*, | |
exception_type: Union[Type[Exception], Tuple[Type[Exception], ...]] = Exception, | |
exception_msg: str = "", | |
default_return: Any = None, | |
) -> Callable[..., ReturnType]: | |
"""handle exception, return default value""" | |
def decorator(func: Callable[..., ReturnType]) -> Callable[..., ReturnType]: | |
async def async_wrapper(*args: Any, **kwargs: Any) -> ReturnType: | |
try: | |
return await func(*args, **kwargs) | |
except exception_type as e: | |
logger.opt(depth=1).error( | |
f"{e}: {exception_msg}, " | |
f"\nCalling {func.__name__} with args: {args}, kwargs: {kwargs} " | |
f"\nStack: {traceback.format_exc()}" | |
) | |
return default_return | |
def sync_wrapper(*args: Any, **kwargs: Any) -> ReturnType: | |
try: | |
return func(*args, **kwargs) | |
except exception_type as e: | |
logger.opt(depth=1).error( | |
f"Calling {func.__name__} with args: {args}, kwargs: {kwargs} failed: {e}, " | |
f"stack: {traceback.format_exc()}" | |
) | |
return default_return | |
if asyncio.iscoroutinefunction(func): | |
return async_wrapper | |
else: | |
return sync_wrapper | |
if _func is None: | |
return decorator | |
else: | |
return decorator(_func) | |