Source code for webspirit.classes.tools.contexterror
from webspirit.config.logger import (
log, LOGGER, Logger, INFO, ERROR, WARNING, DEBUG,
debug, info, error, warning, critical
)
from typing import Callable, TypeVar, ParamSpec
from traceback import format_exception
from types import TracebackType
from functools import wraps
__all__: list[str] = [
'ErrorContextManager', 'ecm',
'raise_error', 're'
]
P = ParamSpec("P")
R = TypeVar("R")
[docs]
class ErrorContextManager:
def __init__(self, message: str = 'EX_TYPE - EX_VALUE', level: int = WARNING, _raise: bool = False, logger: Logger = LOGGER):
"""Un gestionnaire de contexte qui fonctionne similairement à contextlib.suppress(Exception).
Args:
message (str, optional): Le message affiché dans les logs. Il peut prendre différents mots-clés pré-définis. On a ERROR, EX_TYPE, et EX_VALUE par exemple. Defaults to ''.
level (int, optional): Le niveau du message pour le log. Defaults to WARNING.
_raise (bool, optional): Permet de provoquer l'erreur original en plus d'afficher un message dans le log. Defaults to False.
logger (Logger, optional): Un logger pour gérer les logs. Defaults to LOGGER.
"""
self.level = level
self._raise = _raise
self.logger = logger
self.message = message
def __call__(self, fonction: Callable[P, R]) -> Callable[P, R]:
@wraps(fonction)
def _function(*args: P.args, **kwargs: P.kwargs) -> R:
with self:
return fonction(*args, **kwargs)
return _function
def __enter__(self):
return self
def __exit__(self, EX_TYPE: type[BaseException] | None, EX_VALUE: BaseException | None, traceback: TracebackType | None) -> bool:
if EX_TYPE is not None:
ERROR: str = '\n' + ''.join(format_exception(EX_TYPE, EX_VALUE, traceback))
if self.message:
log(self.message.replace('ERROR', ERROR).replace('EX_TYPE', EX_TYPE.__name__).replace('EX_VALUE', str(EX_VALUE)), self.level, self.logger)
return not self._raise
ecm = ErrorContextManager
[docs]
def raise_error(message: str = '', error: type = TypeError, cause: Exception = None, logger: Logger = LOGGER):
error(message, logger)
if cause is None:
raise error(message)
else:
raise error(message) from cause
re = raise_error