在Python上重试decorator
我正在尝试使用重试装饰器。它工作得很好,但当达到最大重试次数时,会出现异常柚木。如何避免此异常从这种情况下很好地返回,或者如何在发生这种情况时返回值在Python上重试decorator,python,decorator,retrying,Python,Decorator,Retrying,我正在尝试使用重试装饰器。它工作得很好,但当达到最大重试次数时,会出现异常柚木。如何避免此异常从这种情况下很好地返回,或者如何在发生这种情况时返回值 import random from retrying import retry @retry( wait_fixed = 500, stop_max_delay = 2000 ) def _do_something_unreliable(): actual = random.randint(0, 10) expected = 1
import random
from retrying import retry
@retry( wait_fixed = 500, stop_max_delay = 2000 )
def _do_something_unreliable():
actual = random.randint(0, 10)
expected = 11
print actual
print expected
print '=' *30
if actual != expected: # retry does not succeed
raise IOError( "Broken" )
_do_something_unreliable()
结果是:
3
11
==============================
7
11
==============================
2
11
==============================
5
11
==============================
Traceback (most recent call last):
File "/home/itaybz/Documents/newKlara/infra/__stam.py", line 15, in <module>
_do_something_unreliable()
File "/home/itaybz/.local/lib/python2.7/site-packages/retrying.py", line 49, in wrapped_f
return Retrying(*dargs, **dkw).call(f, *args, **kw)
File "/home/itaybz/.local/lib/python2.7/site-packages/retrying.py", line 212, in call
raise attempt.get()
File "/home/itaybz/.local/lib/python2.7/site-packages/retrying.py", line 247, in get
six.reraise(self.value[0], self.value[1], self.value[2])
File "/home/itaybz/.local/lib/python2.7/site-packages/retrying.py", line 200, in call
attempt = Attempt(fn(*args, **kwargs), attempt_number, False)
File "/home/itaybz/Documents/newKlara/infra/__stam.py", line 13, in _do_something_unreliable
raise IOError( "Broken" )
IOError: Broken
6
11
==============================
Process finished with exit code 1
3
11
==============================
7.
11
==============================
2.
11
==============================
5.
11
==============================
回溯(最近一次呼叫最后一次):
文件“/home/itaybz/Documents/newKlara/infra/__stam.py”,第15行,在
_做些不可靠的事
文件“/home/itaybz/.local/lib/python2.7/site-packages/retrying.py”,第49行,包装为
返回重试(*dargs,**dkw)。调用(f,*args,**kw)
文件“/home/itaybz/.local/lib/python2.7/site packages/retrying.py”,调用中的第212行
提升尝试。获取()
get中第247行的文件“/home/itaybz/.local/lib/python2.7/site packages/retrying.py”
六.重新释放(自值[0]、自值[1]、自值[2])
文件“/home/itaybz/.local/lib/python2.7/site packages/retrying.py”,第200行,在调用中
尝试=尝试(fn(*args,**kwargs),尝试次数,False)
文件“/home/itaybz/Documents/newKlara/infra/\uuuuu stam.py”,第13行,不可靠的事情
引发IOError(“断开”)
IOError:断开
6.
11
==============================
进程已完成,退出代码为1
这就是应该发生的事情。它到达stop\u max\u delay,因此它停止重试,您将得到调用函数的实际结果。您可以非常轻松地将调用包装在try/except中。或者查看源代码“重试”“重试”并不是很复杂-您可以使用自己的重试来实现所需的行为。我不想将其扭曲为“重试”和“除非”,因为我想在多个函数中使用它。这将是一个不干净的解决方案。重试库已关闭。正如该链接所示,您可以使用坚韧性
,也可以尝试使用包的可怕名称IMHO。我正在使用韧性
,我没有使用opnieuw
,但它看起来很不错。我感到惊讶的是,没有更广泛地采用这些方法,即使是坚韧
也“只有”2800颗星。也只是我的意见,但我会使用一个包,似乎有体面的通过之前推出自己的。毕竟,这就是开源的美妙之处。这就是应该发生的事情。它到达stop\u max\u delay,因此它停止重试,您将得到调用函数的实际结果。您可以非常轻松地将调用包装在try/except中。或者查看源代码“重试”“重试”并不是很复杂-您可以使用自己的重试来实现所需的行为。我不想将其扭曲为“重试”和“除非”,因为我想在多个函数中使用它。这将是一个不干净的解决方案。重试库已关闭。正如该链接所示,您可以使用坚韧性
,也可以尝试使用包的可怕名称IMHO。我正在使用韧性
,我没有使用opnieuw
,但它看起来很不错。我感到惊讶的是,没有更广泛地采用这些方法,即使是坚韧
也“只有”2800颗星。也只是我的意见,但我会使用一个包,似乎有体面的通过之前推出自己的。毕竟,这就是开源的魅力所在。