我有一段代碼嘗試訪問資源,但有時不可用,並導致異常。我嘗試使用上下文管理器實現重試引擎,但我無法處理__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'
有沒有辦法攔截這個異常(S)和處理這裏面的情況管理器?
但我希望它返回 「嘗試3」,而不是1個 –
@MauroBaraldi那是不可能的上下文管理。你可能想使用一個裝飾器。 – thefourtheye
@MauroBaraldi我收錄了一個退休的樣本程序。 PTAL。 – thefourtheye