У меня есть некоторый код, где я пытаюсь получить доступ к ресурсу, но иногда он недоступен и приводит к исключению. Я попытался реализовать механизм повторных попыток, используя менеджеры контекста, но не могу обработать исключение, вызванное вызывающей стороной в контексте __enter__
для моего менеджера контекста.
class retry(object):
def __init__(self, retries=0):
self.retries = retries
self.attempts = 0
def __enter__(self):
for _ in range(self.retries):
try:
self.attempts += 1
return self
except Exception as e:
err = e
def __exit__(self, exc_type, exc_val, traceback):
print 'Attempts', self.attempts
Это несколько примеров, которые просто вызывают исключение (которое я ожидал обработать)
>>> with retry(retries=3):
... print ok
...
Attempts 1
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
NameError: name 'ok' is not defined
>>>
>>> with retry(retries=3):
... open('/file')
...
Attempts 1
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
IOError: [Errno 2] No such file or directory: '/file'
Есть ли способ перехватить эти исключения и обработать их внутри диспетчера контекста?