GenD-Sentinel / src /utils /decorators.py
yermandy's picture
init
c29babb
import contextlib
import functools
from .logger import print_error
class TryExcept(contextlib.ContextDecorator):
"""Usage: @TryExcept() decorator or 'with TryExcept():' context manager."""
def __init__(self, msg: str = "", verbose: bool = True):
"""Initialize TryExcept class with optional message and verbosity settings."""
self.msg = msg
self.verbose = verbose
def __call__(self, func):
"""
Allows the instance to be used as a decorator.
"""
@functools.wraps(func)
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except Exception as e:
if self.verbose:
msg = f"{self.msg}{': ' if self.msg else ''}[red]{e}[/red]"
print_error(f"caught by [green]{func.__name__}[/green] decorator. {msg}")
return wrapper
def __enter__(self):
"""Executes when entering TryExcept context, initializes instance."""
return self
def __exit__(self, exc_type, value, traceback):
"""Defines behavior when exiting a 'with' block, prints error message if necessary."""
if self.verbose and value:
print_error(f"{self.msg}{': ' if self.msg else ''}{value}")
return True