Как объясняется в заголовке, я хочу создать общий класс исключений для наследования от встроенных классов исключений, которые позднее будут обнаружены в других классах.
Вот мой код:
from functools import wraps
class ControlledException(TypeError, AttributeError):
"""A generic exception on the program's domain."""
class WithRetry:
def __init__(self, retries_limit=3, allowed_exceptions=None):
self.retries_limit = retries_limit
self.allowed_exceptions = allowed_exceptions or (ControlledException,)
def __call__(self, operation):
@wraps(operation)
def wrapped(*args, **kwargs):
last_raised = None
for _ in range(self.retries_limit):
try:
return operation(*args, **kwargs)
except self.allowed_exceptions as e:
print(f'retrying {operation.__qualname__} due to {e}')
last_raised = e
raise last_raised
return wrapped
@WithRetry()
def test(x):
x = x + 1
print(x)
test('a')
ControlledException
класс наследует два исключения, TypeError
и AttributeError
, которые я хочу поймать. В этом случае программа поймает TypeError
.
И я понятия не имею, почему параметр self.allowed_exceptions
не влияет на (ControlledException,) ... Однако, если я изменяю (ControlledException,) в Exception или TypeError ошибка перехватывается.