contentmonster/src/contentmonster/classes/retry.py

39 lines
1.3 KiB
Python

from paramiko.ssh_exception import SSHException, NoValidConnectionsError
from socket import timeout
from classes.logger import Logger
class retry:
"""Decorator used to automatically retry operations throwing exceptions
"""
def __init__(self, exceptions: tuple[BaseException] = None):
"""Initializing the retry decorator
Args:
exceptions (tuple, optional): A tuple containing exception classes
that should be handled by the decorator. If none, handle only
paramiko.ssh_exception.SSHException/NoValidConnectionsError and
socket.timeout/TimeoutError. Defaults to None.
"""
self.exceptions = exceptions or (SSHException, NoValidConnectionsError,
timeout, TimeoutError)
self._logger = Logger()
def __call__(self, f):
"""Return a function through the retry decorator
Args:
f (function): Function to wrap in the decorator
Returns:
function: Function wrapping the passed function
"""
def wrapped_f(*args, **kwargs):
while True:
try:
return f(*args, **kwargs)
except self.exceptions as e:
self._logger.info("Caught expected exception: " + repr(e))
return wrapped_f